今天编码的时候,发现了一个错误,就是模板代码在连接的时候找不到方法。函数
状况大概以下:this
在 "Manager.h" 中编码
class Manager {spa
public:编译器
template<typename T>io
void SetData(const T& value);编译
};function
而后在cpp文件中定义SetData模板
template<typename T>class
void Manager::SetData(const T& value) {
}
在另一个main.cpp文件中使用
#include "Manager.h"
Manager mgr;
double n = 0;
mgr.SetData(n);
这样就会产生一个error LNK2019:没法解析的外部符号 “public: void __thiscall Manager::SetData<double>(const double&)” xxxx,该符号在 xx函数中被引用的连接错误。查了一下书籍,错误的缘由在于,function template SetData(const T&)的定义没有具现化,Manager.h和Manager.cpp是分开编译的,在编译main.cpp的过程当中,编译器假设这个template的定义在某个地方,于是只生成一个对该定义的reference,并将这个reference所指的定义式留给连接器去决议,可是在连接期间,又找不到这样一个定义。
Note:奇怪的是,若是n是int类型,又能够编译成功,可是回家后,我用本身的电脑试了一下,VS2008,int类型的也不行
解决这个问题有几个方法:
1)采用置入式。也就是定义也放在头文件中
2)显示具现化一份声明。
即在cpp文件中声明以下 template void Manager::SetData(const double&); ,这样作就要为每个类型作一份声明,比较繁琐
3)采用export关键字。它会export出除inline以外的其余方法
export template <typename T>
class Manager {
public:
void SetData(const T&); //这个声明就会被export
void Print() {}; //不会被export
};