為什麼 C++ 模板只能在標頭檔案中實現?
在 C++ 中例項化一個模板時,編譯器新建一個類。此類具有 template argument 替換為在使用中傳遞給它的實際引數的所有位置。例如,-
template<typename T> class MyClass { T foo; T myMethod(T arg1, T arg2) { // Impl } };
並且在程式中某個地方使用這個類,
MyClass<int> x;
編譯器在遇到此類時,為傳遞給它的每種型別引數建立一個新類。例如,如果使用不同的模板引數建立了 3 個物件,那麼將得到 3 個類,它們等同於 -
class MyClassInt { int foo; int myMethod(int arg1, int arg2) { // Impl } };
為做到這一點,編譯器在遇到這些語句之前需要已經能訪問該類的實現以及方法,以便用模板引數(本例中為 int)例項化它們。如果這些模板類的實現不在標頭檔案中,則它們將不可訪問,並且因此無法編譯。
廣告