一、分离编译概念
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。
二、模板不支持分离编译
有以下场景
函数模板声明在a.h文件中,定义在a.cpp文件中
编译阶段,编译器检查到函数有声明就会暂时略过。但是链接时,由于声明的地方并不知道函数模板实例化成哪一个函数了,因此无法找到函数定义的地址,所以链接失败。
简单来说就是:
定义的地方不知道函数模板T实例化成什么类型,无法实例化,也就无法生成函数定义的地址
调用的地方知道函数模板T实例化成什么类型,但是只有函数声明,没有函数定义
// a.h
template<class T>
T Add(const T& left, const T& right);
// a.cpp
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
// main.cpp
#include"a.h"
int main()
{
Add(1, 2);
Add(1.0, 2.0);
return 0;
}
三、解决模板不支持分离编译的方法
1.在模板定义的地方显式实例化(代码冗余不推荐)
2.将模板声明和定义放在同一个文件中(推荐使用)