将模板类或模板函数的声明和实现放在两个文件中使用时可能会引起链接期错误
类头文件中的声明:
// head.h
#pragma once
template<class T, int N>
class A
{
private:
T value;
char c2[N];
public:
A();
A(T value);
void show();
};
cpp文件中的实现:
template<class T, int N>
A<T,N>::A(){value = 0;}
template<class T, int N>
A<T, N>::A(T value) : value(value){}
主函数:
#include <iostream>
#include "head.h"
int main(void)
{
A <int, 1>a;//链接期错误无法解析外部符号A<int,1>::A<int,1>
return 0;
}
导致错误的原因是在编译期间模板函数和模板类是不生成具体代码的,除非有模板的特化或者被实例化才生成具体代码。程序在主函数中使用了模板类,而主函数只包含了类的声明却没有类的实现,因此程序找到了声明,却没有实现,在链接期的时候,程序去找函数的实现却找不到。
解决方法就是将模板类的声明和实现放在一个文件中,或者在主函数的文件中包含含有类实现的.cpp文件。