一个类模板定义问题

lzr4304061988012 2008-07-21 12:40:00
我在"list.h"头文件中定义了模板类,在"list.cpp"源文件中写了其成员函数的实现,在ex.cpp源文件中有个main()调用模板类
/********list.h************/
#ifndef LIST_H_
#define LIST_H_
#include <iostream>
#include <stdexcept>
........
......
#include "list.cpp"
#endif


/*************list.cpp***************/
#include "list.h"
using namespace std;
.........
......


/****************"ex.cpp"**********/
#include "list.h"
using namespace std;
void main()
{..............}

可是编译的时候老报错,在list.cpp中定义的每一个成员函数都说是:函数模板已定义,参见
list.h中此函数的声明,不晓得为什么?望高人解答!
...全文
112 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwong 2008-07-21
  • 打赏
  • 举报
回复
你在MSDN里搜一下 export keyword,或者google:export template
lzr4304061988012 2008-07-21
  • 打赏
  • 举报
回复
等待高手!
iwong 2008-07-21
  • 打赏
  • 举报
回复
另外类模板和模板类是有区别的。当你定义的时候只存在类模板,当你使用的时候类模板才会被实现成一个实际的类。
iwong 2008-07-21
  • 打赏
  • 举报
回复
这个……如果你并非来自未来,那么不要把类模板的定义和函数实现分开放。
shiyu0371 2008-07-21
  • 打赏
  • 举报
回复
对呀,我使用的经验来看,模板的声明和实现应该都在头文件中。
我的理解是因为模板是一种抽象的东西,cpp或者c是编译器要编译的代码,模板类只有实例化了才能写进cpp文件,编译器才能识别这个类并给这个class分配代码空间并编译出代码;
楼主把一个你都不知道类写进cpp编译器怎么帮你编译呢,我们要探究下为什么编译器不能编译。
xkyx_cn 2008-07-21
  • 打赏
  • 举报
回复
要用这3个文件组成一个编译单元,只需把这3个按顺序组合在一起;
但又不能让源文件(.c,.cpp)出现在工程中,否则每个源文件都会是一个编译单元,
这样在链接的时候就会出现多份定义的情况

[Quote=引用 14 楼 lzr4304061988012 的回复:]
谢谢诸位,特别感谢飞鱼,你能告诉我你那样做的原因吗?我试了可以!
[/Quote]
lzr4304061988012 2008-07-21
  • 打赏
  • 举报
回复
谢谢诸位,特别感谢飞鱼,你能告诉我你那样做的原因吗?我试了可以!
guzhilei1986 2008-07-21
  • 打赏
  • 举报
回复
学习
e_sharp 2008-07-21
  • 打赏
  • 举报
回复
我在"list.h"头文件中定义了模板类,在"list.cpp"源文件中写了其成员函数的实现,在ex.cpp源文件中有个main()调用模板类

-------------------------------------------

模板的声明和实现应该都在头文件中。
laomai 2008-07-21
  • 打赏
  • 举报
回复
把list.cpp中的#include "list.h"去掉,不然你这个是互相包含,编译器没当掉已经是你的运气了。
btw,楼主可以试试下面的代码来测试一下你的编译器的稳定度....
/*a.h*/
#include "a.cpp"

/*a.cpp*/
#include "a.h"

/*main.cpp*/
#include "a.h"
int main(int argc ,char* argv[]){
return 0;
}
sunhuanwen 2008-07-21
  • 打赏
  • 举报
回复
list.h中不能包含list.cpp

所以去掉那行!
hemiya 2008-07-21
  • 打赏
  • 举报
回复
模板类声明和定义最好都写在.h头文件中。
你要是分开写一般包含list.h和list.cpp文件,
.cpp文件会被编译器编译成.obj文件。
这时候你并没有实例化模板类,所以编译器编译模板类
推演失败,结果就是编译失败。

如果想要分开写就参照stl库的方法声明在.h文件中
实现在不是以.c、.cpp、.cxx等C++默认的源代码
文件扩展名中.比如以.mytc(my template class)

在头文件结尾加上 #include "list.mytc"
xkyx_cn 2008-07-21
  • 打赏
  • 举报
回复
1.把#include "list.cpp"从list.h中去掉
2.把list.cpp从工程中去掉
3.在ex.cpp中#include "list.cpp"
我叫司马懿 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iwong 的回复:]
这个……如果你并非来自未来,那么不要把类模板的定义和函数实现分开放。
[/Quote]

类模版的声明和定义好像要写在一起,不能分开,望高人指教
taodm 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lzr4304061988012 的回复:]
export吗?你是想说分别编译模型吗?我现在主要是问下包含编译!
[/Quote]
兄弟,你知道包含模式是怎么定义的吗?
lzr4304061988012 2008-07-21
  • 打赏
  • 举报
回复
export吗?你是想说分别编译模型吗?我现在主要是问下包含编译!

64,649

社区成员

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

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