一个关于模板的奇怪问题.

wtzyb4446 2004-11-20 08:28:09
我用VC6.0自己写一个模板类list,如果我把该类的成员函数定义都写到list.cpp文件中,则报
unresolved external symbol...
的错误,意思是说找不到函数的定义。如果把成员函数写到list.h中(在类定义体外),或者写到工程主cpp文件中(也就是main函数上面了),则编译和运行都正常。
不知有没有大虾遇到过这种问题?
...全文
104 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
carylin 2004-11-20
  • 打赏
  • 举报
回复
摸版的实现与定义一般是放在同个文件中的.
WuYL7812 2004-11-20
  • 打赏
  • 举报
回复
实例化结果当然不一样
template <class T>
class YourTemplate
{
public:
void fun(const T &data)
{
T temp = data;
}
};

这个赋值运算符就有区别,如果T是int,调用全局的赋值,如果T是你写的类,要调用你写的
operator = ()。还有怎么判断这个operator = 是否存在呢,都要等到实例化时才判断对和错
wtzyb4446 2004-11-20
  • 打赏
  • 举报
回复
to WuYL7812(龙哥) :
这个我知道,模板函数是要调用的时候才实例化的。
但是,模板函数的声明定义是不是写在一起,实例化的过程应该是一样的阿,为什么会造成编译的结果不同?
WuYL7812 2004-11-20
  • 打赏
  • 举报
回复
故意写错,我说的是语法错误。
WuYL7812 2004-11-20
  • 打赏
  • 举报
回复
VC.net,和dev c++都不支持这个export
你打开这些编译器写的模板,定义和实现都是放在一起的,放在没有.h的头文件里 <list>
模板必须等到你用它的时候才实例化的,没有确定模板参数,没法编译的,你可以试一下,故意写错类模板的函数体,编译时如果不掉用不报错的,只有你调用这个函数时,在你这个调用点所在函数下面加这个函数的实例化,才知道错了。实例化时必须发现你这个函数体,那些非模板可以分离,是因为事先已经编译成目标文件了。
xiaolizi 2004-11-20
  • 打赏
  • 举报
回复
绕了个弯子,本质上都是一样的^_^
wtzyb4446 2004-11-20
  • 打赏
  • 举报
回复
多谢楼上两位。
其实我还发现一种方法,可以让声明和实现分开:
#include "list.cpp"
不过看起来很不爽。
晨星 2004-11-20
  • 打赏
  • 举报
回复
对的,你说的一点也没错,VC6就是这样的。
对于模块的支持,VC6做的不够的地方还有很多。对于模板,其他的编译器往往也都有不符合标准的地方。
WuYL7812 2004-11-20
  • 打赏
  • 举报
回复
模板类的定义和实现可以分离的,就是用export,但是很少编译器支持这个export,所以如果是模版,类的定义和实现必须放在同一个文件里的.

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧