如果將類模板的聲明和實現寫在兩個獨立的文件中,在構建時會出現“error LNK2019: 無法解析的外部符號 ”的錯誤。
解決方法有:
- 第一種方法,就是把類模板中成員函數的聲明和定義都放在類的定義中(.h文件),不要分開就行。
- 第二種方法,在主文件(main文件)中既包含類模板的聲明文件(接口文件)(.h文件),同時也包含類模板的實現文件(.cpp文件)就行了。
- 第三種方法,在類的定義中(.h文件)的最后包含類模板的實現文件(.cpp文件)。
原因在於模板類和模板函數在使用的時候才會被實例化。當模板被使用時,編譯器需要函數所有的實現代碼,來用合適的類型(模板參數)去構建正確的函數。但是如果將函數實現在單獨的源文件中,這些文件是不可見的,因而會出錯。
下面是摘自 StackOverflow的回答:
Anyway, the reason your code is failing is that, when instantiating a template, the compiler creates a new class with the given template argument. For example:
template<typename T> struct Foo { T bar; void doSomething(T param) {/* do stuff using T */ } }; // somewhere in a .cpp Foo<int> f;
When reading this line, the compiler will create a new class (let's call it FooInt), which is equivalent to the following:
struct FooInt { int bar; void doSomething(int param) {/* do stuff using int */ } }
Consequently, the compiler needs to have access to the implementation of the methods, to instantiate them with the template argument (in this case int). If these implementations were not in the header, they wouldn't be accessible, and therefore the compiler wouldn't be able to instantiate the template.
參考:
CSDN:模板類 error LNK2019: 無法解析的外部符號
StackOverflow:Why can templates only be implemented in the header file?