//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 ;
template <float> class CPAdd ;
#4
楼上的arong1234对,注意声明
#5
虽然对,但是不怎么建议,你不可能把每个可能得类型都这么声明一遍,太麻烦了
#6
#7
其实是和放在一起是一个意思,那个申明就是把那个类在这个CPP文件里可见,相当于把它写了一遍,
编译的时候是要编译进文件的。
虽然标准委员会出了一个叫EXPORT(你可以在MSDN里查到),但由于实现难度和会严重降低编译器的
优化作用,所以,至今没有编译器厂商实现了那个关键字。
所以,你还是习惯把它们写在一起吧。
毕竟STL也是这样写出来的
#8
谢谢大家了!我明白了!
#1
把.cpp的东西放到 .h 中.
分开的话. 现在的编译器貌似都不支持.
分开的话. 现在的编译器貌似都不支持.
#2
现在的编译器不支持 模板分离编译.
#3
如果一定要分开放在两个文件的话,在padd.cpp开头加上
template <float> class CPAdd ;
template <float> class CPAdd ;
#4
楼上的arong1234对,注意声明
#5
虽然对,但是不怎么建议,你不可能把每个可能得类型都这么声明一遍,太麻烦了
#6
#7
其实是和放在一起是一个意思,那个申明就是把那个类在这个CPP文件里可见,相当于把它写了一遍,
编译的时候是要编译进文件的。
虽然标准委员会出了一个叫EXPORT(你可以在MSDN里查到),但由于实现难度和会严重降低编译器的
优化作用,所以,至今没有编译器厂商实现了那个关键字。
所以,你还是习惯把它们写在一起吧。
毕竟STL也是这样写出来的
#8
谢谢大家了!我明白了!