为什么会出现这种错误?
先了解一下情景:
//temp.h
#pragma once
template<class T>
class temp{
void Print();
}
//temp.cpp
#include"temp.h"
template<class T>
void temp<T>::Print(){
std::cout<<" Creat "<<std::endl;
}
报错:LNK2001:无法解析的外部符号
可以看到,我们在temp.h中进行了类的声明,在temp.cpp中进行了方法的实现,这对于一般的类来说这是一个平常的实现方法,但对于模板类来说,情况就不一样了,因为模板类的只有在确定未知类参数时,系统才会给他分配空间,而在编译时,通过分文件实现一个类,会多出一个对接函数地址的步骤,对于一般的类,我们在分文件实现时.h和.cpp文件都会编译出对应的机械码,编译器只需要将其函数接口对接就行了,但对于模板类来说,实现文件中的代码是不会被编译机械码的,所以当编译器是找不到函数接口,只能报错LNK2001了。
解决办法
这里推荐一个个人觉得最好用的;
我们只需要在使用文件中包含实现文件和声明文件即可,这样就可以绕过对接函数地址的步骤了[因为实现和声明都在同一个文件当中,编译器就不会跨文件寻那虚无缥缈的地址了]
//temp.h
#pragma once
template<class T>
class temp{
void Print();
}
//temp.cpp
#include"temp.h"
template<class T>
void temp<T>::Print(){
std::cout<<" Creat "<<std::endl;
}
//use.cpp
#include"temp.h"
#include"temp.cpp"
int main(){
}