一个简单的模板类出LNK2001错误,请大家帮我看看

时间:2022-02-24 17:12:14
编了一个简单的加法模板类,但是把代码放到cpp文件会出现LNK2001错误。放到。h文件中则一切正常。请大家帮我看看。

//PAdd.h

template<class T>
class CPAdd  
{
public:
CPAdd(){};
virtual ~CPAdd(){};
//
T Add(T a, T b);
//T Add(T a, T b){ return  (a+b); };  //it's should right when place here
};

//PAdd.cpp

template <class T>

T CPAdd<T>::Add(T a, T b){ return  (a+b); };


//lab.cpp   include main function
#include "stdafx.h"
#include "PAdd.h"

int main(int argc, char* argv[])
{
CPAdd<int> x;
int r;
 r=x.Add(5,6);
printf("%d\n",r);

CPAdd<float>   y;
printf("%e\n",y.Add(4.5,9.3)); 

return 0;
}

AddLab.obj : error LNK2001: unresolved external symbol "public: float __thiscall CPAdd<float>::Add(float,float)" (?Add@?$CPAdd@M@@QAEMMM@Z)
AddLab.obj : error LNK2001: unresolved external symbol "public: int __thiscall CPAdd<int>::Add(int,int)" (?Add@?$CPAdd@H@@QAEHHH@Z)
Debug/AddLab.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

8 个解决方案

#1


把.cpp的东西放到 .h 中. 

分开的话. 现在的编译器貌似都不支持.

#2


现在的编译器不支持 模板分离编译.

#3


如果一定要分开放在两个文件的话,在padd.cpp开头加上
template <float> class CPAdd   ;

#4


楼上的arong1234对,注意声明

#5


虽然对,但是不怎么建议,你不可能把每个可能得类型都这么声明一遍,太麻烦了

引用 4 楼 hagangqiou 的回复:
楼上的arong1234对,注意声明

#6


引用 1 楼 cunsh 的回复:
把.cpp的东西放到 .h 中.  

分开的话. 现在的编译器貌似都不支持.

#7


引用 3 楼 arong1234 的回复:
如果一定要分开放在两个文件的话,在padd.cpp开头加上 
template  <float> class CPAdd   ;


其实是和放在一起是一个意思,那个申明就是把那个类在这个CPP文件里可见,相当于把它写了一遍,
编译的时候是要编译进文件的。

虽然标准委员会出了一个叫EXPORT(你可以在MSDN里查到),但由于实现难度和会严重降低编译器的
优化作用,所以,至今没有编译器厂商实现了那个关键字。

所以,你还是习惯把它们写在一起吧。

毕竟STL也是这样写出来的

#8


谢谢大家了!我明白了!

#1


把.cpp的东西放到 .h 中. 

分开的话. 现在的编译器貌似都不支持.

#2


现在的编译器不支持 模板分离编译.

#3


如果一定要分开放在两个文件的话,在padd.cpp开头加上
template <float> class CPAdd   ;

#4


楼上的arong1234对,注意声明

#5


虽然对,但是不怎么建议,你不可能把每个可能得类型都这么声明一遍,太麻烦了

引用 4 楼 hagangqiou 的回复:
楼上的arong1234对,注意声明

#6


引用 1 楼 cunsh 的回复:
把.cpp的东西放到 .h 中.  

分开的话. 现在的编译器貌似都不支持.

#7


引用 3 楼 arong1234 的回复:
如果一定要分开放在两个文件的话,在padd.cpp开头加上 
template  <float> class CPAdd   ;


其实是和放在一起是一个意思,那个申明就是把那个类在这个CPP文件里可见,相当于把它写了一遍,
编译的时候是要编译进文件的。

虽然标准委员会出了一个叫EXPORT(你可以在MSDN里查到),但由于实现难度和会严重降低编译器的
优化作用,所以,至今没有编译器厂商实现了那个关键字。

所以,你还是习惯把它们写在一起吧。

毕竟STL也是这样写出来的

#8


谢谢大家了!我明白了!