将包含模板的源文件与头文件分开
关键在于模板显式实例化。
解决方案
模板函数分离源文件
按一般方式编写.h和.cpp文件,但注意添加template 的声明;在.cpp文件末尾,添加模板显式实例化代码,如:
// 显式实例化,注意,`template`之后没有``,若添加则会报错!
// 每种将被使用的类型,均需要进行显式实例化
template void A::show(int &&);
template void A::show(double &&);
template void A::show(bool &&);
模板类分离源文件
分开编写模板类的.h和.cpp文件,注意添加template 的声明;在.cpp文件末尾,添加类的显式实例化代码,如:
// 只需要class的显式实例化即可,不需要再写其成员函数的显式实例化代码
template class Base;
在使用该模板类的其他类的.h文件末尾,添加外部模板类的显式实例化声明(仅仅是多了个extern关键字):
// 添加这行代码的目的,其实是为了消除编译警告。即便删掉它,也不会导致编译错误
extern template class Base;
前面是简单描述模板函数/类的源文件与头文件分离的方法,难免有疏漏。若仍存有疑问,可继续往下看具体案例。
示例代码
模板函数
t.h
#ifndef _T_H
#define _T_H
class A
{
public:
template
void show(T &&t);
};
#endif // _T_H
t.cpp
#include "t.h"
#include
using namespace std;
template
void A::show(T &&t)
{
string info = typeid(t).name();
cout |