c++带有模板的类,它的方法只能实现在.h里吗?

例:#pragmaonce#include<list>template<typenameT>classIdGenerator{public:……TGen();……};/*... 例:

#pragma once
#include <list>

template<typename T> class IdGenerator

{
public:
……

T Gen();
……
};

/*下面这段代码写在.h里面就能编译通过
*但是剪切、粘贴到.cpp就编译不过,报错“无法解析的外部符号”*/
template<typename T>
T IdGenerator<T>::Gen()
{
return 0;
}
为什么只能写在.h里面?

还有一个问题:
尽管报错“无法解析的外部符号”,但是在.cpp中右键点Gen这个方法,然后点“转到声明”,仍然能转到头文件相应的声明,说明能链接上啊?为什么无法解析?
展开
 我来答
Iinux
2014-08-20 · TA获得超过327个赞
知道答主
回答量:67
采纳率:100%
帮助的人:75.5万
展开全部
也不是只能放在.h里面,但是推荐放在.h里面。STL模板实现全部是放在.h里面的。
------------------
编译能通过。
1)参与编译的只是.cpp文件,不会报错的原因,是因为它能在.h里面找到模板的声明。
链接错误。
1)链接的时候,需要实例化模板,这时候就需要找模板的具体实现了。假设在main函数中调用了一个模板函数,这时候就需要去实例化该类型的模板。注意main函数里面只包含了.h文件,也就是只有模板的声明,没有具体实现。就会报错。
2)而模板的实现.cpp里面,虽然有模板的具体实现,但是没有谁在该.cpp里面使用一个模板函数,就不会生成一个具体化的实例。
ps:模板是在需要的时候,才会去生成一个具体化的实例的,比如,你只要一个int型的实例,模板就只会给你生成一个int型的实例,模板本身是不会被执行的(也就是模板本身不产生汇编指令),是模板生成的具体化实例才产生指令(这个实例是隐藏的,我们是看不到的)

解决方案:
1)将模板实现写在.h里面
2)如果你非要写在.cpp里面,那么请在模板实现的.cpp文件里面(或者.h里面)显式的实例化一个模板。如果是这样的话,那模板就没有太大的意义了,难道你去自己手动实例化所有的实例?
solotony
2014-08-20 · TA获得超过599个赞
知道小有建树答主
回答量:700
采纳率:0%
帮助的人:575万
展开全部
是的,只能在头文件中。C++不会直接编译模板自身,它需要根据使用的情况,生成一些代码,再编译这部分代码。

“转到声明”这是IDE的能力,不是C++语言本身的概念,与链接无关。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zjfaok
2014-08-20 · TA获得超过6807个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1627万
展开全部
不能链接

.h 显然不是只给这一个 .cpp 文件用的。在编译这个 .cpp 文件的时候根本不知道 要用哪些模板参数实例化这个模板;在编译其他 包含这个 .h 文件、并且使用了 IdGenerator 的 .cpp 文件的时候,告诉了编译器要用哪些模板参数实例化这个模板,但是又不知道如何实例化这个模板
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式