编译器在编译模板时,并不会生成代码,只有遇到实例化的时候才会生成代码。因此,当我们只引用模板声明文件的时候,在实例化的对象时候,模板的定义问文件是不可见的,于是出现链接错误。例如:
//A.h #pragma once template<typename T> class A{ public: A(); ~A(); };
//A.cpp #include"A.h" template<typename T> A<T>::A(){ } template<typename T> A<T>::~A(){ }
//Main.cpp #include"A.h" int main() { A<int> a; return 1; }
以上的模板使用则会出现LNK2019错误,原因如上述所言。
解决方法:
(1)在Main.cpp当中同时引用A.h和A.cpp文件,如下所示:
#include"A.h" #include"A.cpp" int main() { A<int> a; return 1; }
(2)将A的声明和定义同时写在一个文件当中。如下所示:
#pragma once template<typename T> class A{ public: A(); ~A(); }; template<typename T> A<T>::A(){ } template<typename T> A<T>::~A(){ }
以上。