关于.template文件的问题

wind2411hawk 2009-06-07 10:09:22
我在 A.h 文件中定义一个类 A
class A
{
};
类的实现放在A.cpp文件中

在其他程序中我要用类A,#include"A.h",可是这样只包含了类A的定义,而没有类A的实现,怎样才能包含类A的实现,难道要 #include"A.cpp"吗?

我后来想到一个办法,就的在 A.h 中加一句
class A
{
};
#include"A.cpp"
可是这样编译会出错当我把A.cpp改成A.template就通过了,这是怎么回事?

这两个问题请大侠们帮我解答
...全文
158 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
省下a.cpp吧
直接拷贝内容到a.h中
Jalien 2009-06-07
  • 打赏
  • 举报
回复
VS 2008虽然不支持分离编译,但是支持包含编译模型的。[Quote=引用 10 楼 wind2411hawk 的回复:]
7楼的仁兄 什么是EDG编译器支持
我用vs2008都不支持分离编译模型
[/Quote]
Jalien 2009-06-07
  • 打赏
  • 举报
回复
vs2008是不支持分离编译啊。
谁告诉你vs 2008支持了?听你一说好像vs 2008是最好的编译器一样的~
EDG是个编译器。[Quote=引用 10 楼 wind2411hawk 的回复:]
7楼的仁兄 什么是EDG编译器支持
我用vs2008都不支持分离编译模型
[/Quote]
goodname 2009-06-07
  • 打赏
  • 举报
回复
目前大多数编译器都不支持模板分离

如果支持的话,可以使用export关键字
wind2411hawk 2009-06-07
  • 打赏
  • 举报
回复
我的是模板类啊 模板类不支持定义和实现分离吗
whatstheweather 2009-06-07
  • 打赏
  • 举报
回复
2008 不支持?
ltc_mouse 2009-06-07
  • 打赏
  • 举报
回复
一般只要类的定义就够了吧,链接时能找到对应的实现的呀~~
如果你的类是模板类,就都放在.h中好了,好像目前还很少有编译器支持分离编译的
wind2411hawk 2009-06-07
  • 打赏
  • 举报
回复
7楼的仁兄 什么是EDG编译器支持
我用vs2008都不支持分离编译模型
goodname 2009-06-07
  • 打赏
  • 举报
回复
神奇的做法。

A.template是什么文件?
adventurelw 2009-06-07
  • 打赏
  • 举报
回复
如果A是模版
template <class T>
class A
{
};
#include"A.cpp"//A.cpp是模版的实现文件

编译文件中不包含A.cpp但A.cpp在项目中时,则上面是正确的,也肯定能够编译成功;楼主说的情况没见过,.template不是正确的文件名,编译器
认不出液太傻了吧。

lylm 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lylm 的回复:]
在其他程序中我要用类A,#include"A.h",可是这样只包含了类A的定义,而没有类A的实现,怎样才能包含类A的实现,难道要 #include"A.cpp"吗?
>>当然不用,通常A.cpp会编译成.o或程序库,在链接时,自然可找到A的实现

可是这样编译会出错当我把A.cpp改成A.template就通过了,这是怎么回事?
如果包含A.cpp,会有2个类实现,编译器报重复定义,改成A.template后,编译器不会认为这是个C++实现,也就可编译通过
[/Quote]
再补充一下,A.template改成其他的也行,比如A.inc,VC6测试通过
Jalien 2009-06-07
  • 打赏
  • 举报
回复
模版有两种编译模型,一种是包含编译模型,一种是分离编译模型,包含编译模型所有编译器都实现了的,分离编译
模型据说只有EDG编译器支持。
lz你用包含编译模型吧。
给你个示例:
A.h(声明)

#ifndef A_H
#define A_H
template<class T>
class A
{
........
};
#include "A.cpp" //包含cpp文件
#endif //A_H


A.cpp(实现)

#ifndef A_CPP
#define A_CPP
#include "A.h"

.........实现

#endif //A_CPP


main

#include<A.h>
int main(){
.......
return 0;
}


lz可以参考这个贴中http://topic.csdn.net/u/20090528/11/a3a22523-c38a-41e8-9df6-e8d3632f7fd6.html 我的回答。

tianya0609 2009-06-07
  • 打赏
  • 举报
回复
LZ把三个程序都发上来和环境也说下,有点神奇的样子。搜藏下,O(∩_∩)O哈哈~
lylm 2009-06-07
  • 打赏
  • 举报
回复
在其他程序中我要用类A,#include"A.h",可是这样只包含了类A的定义,而没有类A的实现,怎样才能包含类A的实现,难道要 #include"A.cpp"吗?
>>当然不用,通常A.cpp会编译成.o或程序库,在链接时,自然可找到A的实现

可是这样编译会出错当我把A.cpp改成A.template就通过了,这是怎么回事?
如果包含A.cpp,会有2个类实现,编译器报重复定义,改成A.template后,编译器不会认为这是个C++实现,也就可编译通过

65,211

社区成员

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

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