模板实例化问题(读书笔记)
模板实例化笔记:与通常的类成员函数相比,模板成员函数的实现方式略有不同。类模板成员函数的定义和实现
必须放在同一个头文件里。考虑若下代码:
//b.h
template<class>
class b
{
public:
b();
~b();
};
//b.cpp
#include "b.h"
template <class t>
b<t>::b(){}
template<class t>
b<t>::b(){}
//main.cpp
#include "b.h"
void main()
{
b<int> bi;
b<float> bf;
}
在编译b.cpp的时候,编译器是既有定义,又有声明。此时编译器并不需要为模板类生成任何定义,
因为还不存在实例。而当编译器编译main.cpp时,有了两个实例:模板类b<int>和b<float>。此时
编译器只有声明而没有定义!!!
解决办法:
1.将b.cpp 与b.h合在一起,只写在有文件b.h中
2.在b.h中,后再另外添加
"templateinstantiations.cpp"文件,对所有要用到的模板实例进行显式声明,这样所有的实例化过程都叫个了
这个文件;
//templateinstantiations.cpp
#include "b.cpp"
template class b<int>;
template class b<float>;
//end file