為什麼 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)例項化它們。如果這些模板類的實現不在標頭檔案中,則它們將不可訪問,並且因此無法編譯。


更新於: 11-Feb-2020

781 次瀏覽

開啟你的 職業生涯

完成該課程以獲得認證

開始
廣告