我们先用一个实例来看一下模板分离现象
头文件
#include<iostream>
using namespace std;
template < class T >
class A
{
public:
A();
private:
int _a;
};
模板类
#include"template.h"
template<class T>
void test()
{
A<T>::A()
:_a(0)
{
}
}
测试文件
#include"template.h"
int main()
{
A<int> a;
system("pause");
return 0;
}
错误展示
通过上面的例子,我们发现链接不通过,这就验证了模板类不能分离编译,那么为什么呢???
程序出现的是链接性错误,也就是说预处理、编译、汇编、链接,在链接时出了错,而一般出现出现链接错误是因为声明了一个函数,但是没有实现它。因此,当程序在链接时,从符号表中只找到了函数名,找不到具体函数实现的地址,因此编译器会报这样的错误。
那么,为什么模板在分离编译时会报这样的错误呢?
我们都知道模板需要两次编译,第一次编译是在实例化之前,用来检查基本的语法错误。第二次编译是在实例化之后,当把它实例化具体的类型时,再次判断有没有语法错误。
怎么解决这个问题呢?
(1)在模板的实现文件里显示实例化;
(2)将定义和声明放在同一个文件里。