在C++中,用到類模板時,如果類似一般的類聲明定義一樣,把類聲明放在.h文件中,而具體的函數定義放在.cpp文件中的話,會發現編譯器會報錯。如類似下面代碼:
//test.h文件 #ifndef TEST_H_ #define TEST_H_ template <class T> class test { private: T a; public: test(); }; #endif
//test.cpp文件 #include "test.h" template <class T> test<T>::test() { a = 0; }
//main.cpp文件 #include <iostream> #include "test.h" using namespace std; int main() { test<int> abc; }
以上代碼在編譯時會產生如下錯誤:
Error 2 error LNK1120: 1 unresolved externals Error 1 error LNK2019: unresolved external symbol "public: __thiscall test<int>::test<int>(void)" (??0?$test@H@@QAE@XZ) referenced in function _main
原因在於,類模版並不是真正的類,它只是告訴編譯器一種生成類的方法,編譯器在遇到類模版的實例化時,就會按照模版生成相應的類。
在這里就是編譯器遇到main函數中的test<int> abc;時就會去生成一個int類型的test類。
而每一個cpp文件是獨立編譯的,那么如果將類模版的成員函數單獨放在一個cpp文件中,編譯器便無法確定要根據什么類型來產生相應的類,也就造成了錯誤。
一般的解決方法就是將類模版中的成員函數定義也寫入.h文件中。