我想回顾一下简单的模板写法,但是却报链接错误,是我有啥基本错误吗?

Kshape 2008-05-06 05:19:28
这是第1个头文件:queue.h
#ifndef QUEUE_H
#define QUEUE_H

template <class Type>
class Queue {
public:
Queue();
};

#endif


这是第2个源文件:queue.cpp
#include "queue.h"
#include <iostream>
using namespace std;

template<class Type>
Queue<Type>::Queue() {
cout << "constructor\n" << endl;
}


这是第3个源文件:main.cpp
#include "queue.h"
#include <iostream>

using namespace std;

int main() {
Queue<int> q;
}


我用如下命令"g++ *.cpp"编译并连接却报错:

QUOTE:
/tmp/ccU4wZk5.o: In function `main':
main.cpp.text+0x194): undefined reference to `Queue<int>:Queue()'
collect2: ld returned 1 exit status
...全文
159 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
f22fbi 2008-05-07
  • 打赏
  • 举报
回复
学习
lily604 2008-05-07
  • 打赏
  • 举报
回复
#include "queue.h"
#include <iostream>
#include "queue.cpp"
using namespace std;

int main() {
Queue <int> q;
}
如上所说很多编译器不支持模板头文件和实现文件分离
ShardowM 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 biosli 的回复:]
引用 1 楼 baihacker 的回复:
模板不支持头文件和实现文件分离...请把实现写在头文件里


引用 2 楼 kakaying 的回复:
补充一下,c++标准是支持模板的声明和实现分离的,但是目前多数编译器都没有提供对此特性的支持


楼上两位正解~~
[/Quote]

现在决大多数编译器不支持
con_con 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 biosli 的回复:]
引用 1 楼 baihacker 的回复:
模板不支持头文件和实现文件分离...请把实现写在头文件里


引用 2 楼 kakaying 的回复:
补充一下,c++标准是支持模板的声明和实现分离的,但是目前多数编译器都没有提供对此特性的支持


楼上两位正解~~
[/Quote]
stoneyrh 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 biosli 的回复:]
引用 5 楼 baihacker 的回复:
引用 4 楼 fetag 的回复:
标准里面提供了一个export关键字,为了解决模板的定义与实现分离问题,可惜...这个关键字编译器实现的不好...


个人觉得是不用实现这个关键字...

模板类本身不产生实体,只有实例化的时候才产生实体,等实体化再去查找实现文件是多此一举.


其实,不能实现分离的话最大的损失就是程序不好做保密工作。
[/Quote]

保密工作也可以通过其它方式来实现的,不一定就得写在实现里,比如你可以调用被你保密后的接口实现来处理
biosli 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baihacker 的回复:]
引用 4 楼 fetag 的回复:
标准里面提供了一个export关键字,为了解决模板的定义与实现分离问题,可惜...这个关键字编译器实现的不好...


个人觉得是不用实现这个关键字...

模板类本身不产生实体,只有实例化的时候才产生实体,等实体化再去查找实现文件是多此一举.
[/Quote]

其实,不能实现分离的话最大的损失就是程序不好做保密工作。
北极猩猩 2008-05-06
  • 打赏
  • 举报
回复
呵呵,又是这个问题,已经是模板的月经贴了。

现在好像已经有了可以支持模板分离的编译器了,不过所有主流编译器都还不支持
cad_vc 2008-05-06
  • 打赏
  • 举报
回复
申明和实现放到同一个文件
Cpp权哥 2008-05-06
  • 打赏
  • 举报
回复
对于模板,最好是把声明和定义放在一个文件中。如果确实希望分离在两个文件中,一般是用一个.tcc文件写模板定义,头文件中写模板声明,并且在头文件中用#include来包含那个.tcc文件。
独孤过儿 2008-05-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baihacker 的回复:]
引用 4 楼 fetag 的回复:
标准里面提供了一个export关键字,为了解决模板的定义与实现分离问题,可惜...这个关键字编译器实现的不好...


个人觉得是不用实现这个关键字...

模板类本身不产生实体,只有实例化的时候才产生实体,等实体化再去查找实现文件是多此一举.
[/Quote]
标准委员会关于export的实现问题,据说耗费了一年多的时间...
baihacker 2008-05-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fetag 的回复:]
标准里面提供了一个export关键字,为了解决模板的定义与实现分离问题,可惜...这个关键字编译器实现的不好...
[/Quote]

个人觉得是不用实现这个关键字...

模板类本身不产生实体,只有实例化的时候才产生实体,等实体化再去查找实现文件是多此一举.
独孤过儿 2008-05-06
  • 打赏
  • 举报
回复
标准里面提供了一个export关键字,为了解决模板的定义与实现分离问题,可惜...这个关键字编译器实现的不好...
biosli 2008-05-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
模板不支持头文件和实现文件分离...请把实现写在头文件里
[/Quote]

[Quote=引用 2 楼 kakaying 的回复:]
补充一下,c++标准是支持模板的声明和实现分离的,但是目前多数编译器都没有提供对此特性的支持
[/Quote]

楼上两位正解~~
kakaying 2008-05-06
  • 打赏
  • 举报
回复
补充一下,c++标准是支持模板的声明和实现分离的,但是目前多数编译器都没有提供对此特性的支持
baihacker 2008-05-06
  • 打赏
  • 举报
回复
模板不支持头文件和实现文件分离...请把实现写在头文件里

64,654

社区成员

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

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