关于模板的问题,很是疑惑!!!

MutouMajia 2009-04-10 12:31:15
同样的代码,以两种形式写有一种报错,另一种却没错。

第一种情况(无错):
代码都在同一个文件main.cpp中:


#include <iostream>
#include "A.h"
using namespace std;

template <typename Type>
class A
{
class B
{
Type data;
};

B b;

public:
void init(const Type & t);
};

template <typename Type>
void A<Type>::init(const Type & t)
{
cout << "hi" << endl;
}

int main()
{
A<int> a;
a.init(7);
return 0;
}

// Everything is ok.


第二种情况(报错):
把类A分开为头文件A.h与源文件A.cpp,
A.h的内容:

#include <iostream>
using namespace std;

template <typename Type>

class A
{
class B
{
Type data;
};

B b;

public:
void init(const Type & t);
};


A.cpp的内容:

#include "A.h"

template <typename Type>
void A<Type>::init(const Type & t)
{
cout << "hi" << endl;
};


main.cpp的内容:



#include <iostream>
#include "A.h"
using namespace std;

int main()
{
A<int> a;
a.init(7); // error here. If remove this line, no error.
return 0;
}



为什么啊。。。。
...全文
87 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
MutouMajia 2009-04-10
  • 打赏
  • 举报
回复
thx!

看来我的理论知识差太多了,呵呵
Clerk_9919 2009-04-10
  • 打赏
  • 举报
回复
在C++语言的不同实现中,模板编译模式(模板初始化的方法)大致可分为三种:

* Borland模型(包含模板编译模式):编译器生成每个编译单元中遇到的所有的模板实例,并存放在相应的目标文件中;链接器合并相同的模板实例,生成可执行文件。为了在每次模板实例化时模板的定义都是可见的,模板的声明与定义放在同一个.h文件中。这种方法的优点是链接器只需要处理目标文件;这种方法的缺点是由于模板实例被重复编译,编译时间被加长了,而且不能使用系统的链接器,需重新设计链接器。
* Cfront/查询模型(分离(Separation)模板编译模式):AT&T公司的C++编译器Cfront为解决模板实例化问题,增加了一个模板仓库,用以存放模板实例的代码并可被自动维护。当生成一个目标文件时,编译器把遇到的模板定义与当前可生成的模板实例存放到模板仓库中。链接时,链接器的包装程序(wrapper)首先调用编译器生成所有需要的且不在模板仓库中的模板实例。这种方法的优点是编译速度得到了优化,而且可以直接使用系统的链接器;这种方法的缺点是复杂度大大增加,更容易出错。使用这种模型的源程序通常把模板声明与非内联的模板成员分别放在.h文件与模板定义文件中,后者单独编译。
* 混合(迭代)模型:g++目前是基于Borland模型完成模板实例化。g++未来将实现混合模型的模板实例化,即编译器把编译单元中的模板定义与遇到的当前可实现的模板实例存放在相应的目标文件中;链接器的包装程序(wrapper)调用编译器生成所需的目前还没有实例化的模板实例;链接器合并所有相同的模板实例。使用这种模型的源程序通常把模板声明与非内联的模板成员分别放在.h文件与模板定义文件中,后者单独编译。

目前常用的基本上都是Borland模型
  • 打赏
  • 举报
回复
模板的声明跟定义都应该放在头文件里。
不然要用export关键字,普通情况下,编译器不支持模板分离编译。
MutouMajia 2009-04-10
  • 打赏
  • 举报
回复
to Clerk_9919

why?
可以提供进一步的理论资料么?
Clerk_9919 2009-04-10
  • 打赏
  • 举报
回复
模板的实现代码都应该放在.h文件中

65,187

社区成员

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

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