為了訪問其他編譯單元(如另一代碼文件)中的變量或對象,對普通類型(包括基本數據類、結構和類),可以利用關鍵字extern,來使用這些變量或對象時;但是對模板類型,則必須在定義這些模板類對象和模板函數時,使用標准C++新增加的關鍵字export(導出/出口/輸出)。例如:
extern int n;
extern struct Point p;
extern class A a;
export template<class T> class Stack<int> s;
export template<class T> void f (T& t) {……}
一般是在頭文件中給出類的定義或全局函數的聲明信息,而在代碼文件中給出具體的(類成員函數或全局函數的)函數定義。然后在多個用戶代碼文件中包含該頭文件后,就可以使用其中定義或聲明的類和函數。頭文件中一般不包含變量、結構和類對象的定義,因為這樣可能會導致重復定義的編譯錯誤。解決辦法是,在某個代碼文件中進行定義,在其他用戶代碼文件中用extern來引用它們。
但是對模板類型,則可以在頭文件中,聲明模板類和模板函數;在代碼文件中,使用關鍵字export來定義具體的模板類對象和模板函數;然后在其他用戶代碼文件中,包含聲明頭文件后,就可以使用該這些對象和函數了。例如:
// out.h:(聲明頭文件——只包含out函數的聲明信息)
template<class T> void out (const T& t);
// out.cpp:(定義代碼文件——包含out函數的聲明[通過include]和定義等全部信息)
#include <iostream>
#include “out.h”
export template<class T> void out (const T& t) {std::cerr << t;}
//user.cpp:(用戶代碼文件——包含函數的聲明頭文件后就可以使用該函數)
#include “out.h”