C++ 为什么这个类模板的构造函数老是link2019错误啊...
最简单的情况下....一个工程文件,VS2012环境。头文件:a.h:#ifndefa_h#definea_htemplate<classT>classa{Tc;publ...
最简单的情况下....一个工程文件,VS2012环境。
头文件:a.h:
#ifndef a_h
#define a_h
template <class T>
class a
{
T c;
public:
a(T);
};
#endif
源文件: a.cpp 和 test.cpp
a.cpp:
#include"a.h"
template <class T>
a<T>::a(T i):c(i)
{}
test.cpp:
#include<iostream>
#include"a.h"
int main()
{
int i;
a<int> b(5);
return 0;
}
然后报错...
test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall a<int>::a<int>(int)" (??0?$a@H@@QAE@H@Z),该符号在函数 _main 中被引用
都扔一个CPP里执行一点事儿没有,分开就坏事儿。或者把构造函数放在头文件里也没事......
快疯掉了.... 展开
头文件:a.h:
#ifndef a_h
#define a_h
template <class T>
class a
{
T c;
public:
a(T);
};
#endif
源文件: a.cpp 和 test.cpp
a.cpp:
#include"a.h"
template <class T>
a<T>::a(T i):c(i)
{}
test.cpp:
#include<iostream>
#include"a.h"
int main()
{
int i;
a<int> b(5);
return 0;
}
然后报错...
test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall a<int>::a<int>(int)" (??0?$a@H@@QAE@H@Z),该符号在函数 _main 中被引用
都扔一个CPP里执行一点事儿没有,分开就坏事儿。或者把构造函数放在头文件里也没事......
快疯掉了.... 展开
展开全部
有2种解决办法.
1.a类的声明和实现放在同一个文件,
2.在a.h的#endif前面 加上#include "a.cpp"
原因是模板的编译和非模板的编译不同,
非模板在编译的时候,会自动找到有#include<a.h>的文件加进去一起编译
但是模板编译,系统先生成一个对应类型的实例,再进行编译的,如果在不同文件,
那么就会出现问题,声明文件和定义文件无法匹配
例如:
该模板有2个实例:
a<int> b(5);
a<double> c(5.0);
那么模板就会生成2个实例 ,但是匹配的时候,发现有2个a.h文件,和2个a.cpp文件
在a.cpp文件里面都有#include"a.h"语句 , 对于其中一个a.h,不知道应该寻找那个a.cpp文件进行匹配定义
1.a类的声明和实现放在同一个文件,
2.在a.h的#endif前面 加上#include "a.cpp"
原因是模板的编译和非模板的编译不同,
非模板在编译的时候,会自动找到有#include<a.h>的文件加进去一起编译
但是模板编译,系统先生成一个对应类型的实例,再进行编译的,如果在不同文件,
那么就会出现问题,声明文件和定义文件无法匹配
例如:
该模板有2个实例:
a<int> b(5);
a<double> c(5.0);
那么模板就会生成2个实例 ,但是匹配的时候,发现有2个a.h文件,和2个a.cpp文件
在a.cpp文件里面都有#include"a.h"语句 , 对于其中一个a.h,不知道应该寻找那个a.cpp文件进行匹配定义
展开全部
你应该把a.cpp的内容也写到a.h中,因为模板不是真正去编译的代码,所以多次include是没问题的,而且你不include的话,test.cpp里面是找不到构造函数的定义的。你看看STL的代码,都是写在头文件中的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上说的是一般的解决办法,没有错。
有的要将控制台更改。
但是有的问题不在这,我之前添加VISA库编译就遇到这个问题,按照别人说的添加库路径没有用,我是64位系统,使用VS2013,默认编译使用的是win32,怎么样都提示这个错误。后来在网上找到了个帖子,将win32更改为X64,编译成功无错误。
还有的不知道如何添加库的,直接使用全路径也能解决,#pragma comment(lib,“C:\\A\\B\\C\\XXXX.lib”)。
有的要将控制台更改。
但是有的问题不在这,我之前添加VISA库编译就遇到这个问题,按照别人说的添加库路径没有用,我是64位系统,使用VS2013,默认编译使用的是win32,怎么样都提示这个错误。后来在网上找到了个帖子,将win32更改为X64,编译成功无错误。
还有的不知道如何添加库的,直接使用全路径也能解决,#pragma comment(lib,“C:\\A\\B\\C\\XXXX.lib”)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用template的时候实现和声明应该都放在头文件里面
虽然有些诡异的情况下放cpp里也可以用,但是不是标准的做法,这个是根据编译器不同而不同的,所以尽量把实现都放在头文件里。你的这个例子报错的内容就是找不到那个调用函数的代码。
虽然有些诡异的情况下放cpp里也可以用,但是不是标准的做法,这个是根据编译器不同而不同的,所以尽量把实现都放在头文件里。你的这个例子报错的内容就是找不到那个调用函数的代码。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定义模板的时候所有的东西放在同一个文件里。。。
这就是答案,,
这就是答案,,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询