C++ 为什么这个类模板的构造函数老是link2019错误啊...

2024-11-25 20:46:57
推荐回答(5个)
回答1:

有2种解决办法.
1.a类的声明和实现放在同一个文件,
2.在a.h的#endif前面 加上#include "a.cpp"

原因是模板的编译和非模板的编译不同,启汪渣
非模板在编译的时候,会自动找到有#include的文件加进去一起编译
但是模板编译,系统先生成一个对应类型的实例,再进行编译的,如果在不同文件,
那么就会悄悄出现问题,声明文件和定义文件无法匹配
例如:
该模板有2个实例:
a b(5);
a c(5.0);
那么模板就会生成2个实例 ,但是匹配的时候,发现有2个a.h文陵瞎件,和2个a.cpp文件
在a.cpp文件里面都有#include"a.h"语句 , 对于其中一个a.h,不知道应该寻找那个a.cpp文件进行匹配定义

回答2:

你应该把a.cpp的内容也写到a.h中态锋,因为模板不是真正去编译谈郑的代码,所以多次帆侍晌include是没问题的,而且你不include的话,test.cpp里面是找不到构造函数的定义的。你看看STL的代码,都是写在头文件中的。

回答3:

楼上说的是一般的解决办法,没有错。
有的要将控制台更改。
但是有的问题不在这御运,我之前添加VISA库编译就遇到这首拦个问题,按照别人说的添加库路径没有用,我是64位系镇芹梁统,使用VS2013,默认编译使用的是win32,怎么样都提示这个错误。后来在网上找到了个帖子,将win32更改为X64,编译成功无错误。
还有的不知道如何添加库的,直接使用全路径也能解决,#pragma comment(lib,“C:\\A\\B\\C\\XXXX.lib”)。

回答4:

用template的时候实现州迅雹和声明应该都放在头文件里面

虽然有些诡异的情况下放cpp里也可昌敏以用,但是不是标准的做法,这个是根据编译器不同而不同的,所以尽量把实现都放在头文件里。你的这个例子报错的内容就是找不到那个调用函数册帆的代码。

回答5:

定义模板的时候所有的东西放在同一个文件里。。。
这就是答案,,