模板声明与定义要放在同一文件中?

博客介绍了模板函数在分开编译时出现的问题。main.cpp和temp.cpp分开编译,编译器在编译main.cpp时无法实例化fun(T),temp.cpp编译时也不知main.cpp的使用情况,导致linker报告无法解析的外部符号。建议将模板声明和定义放同一.h文件,这也是STL头文件含模板定义的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

temp.h:
void fun(T);

temp.cpp:
#include “temp.h”
void fun(T){}

main.cpp:
#include “temp.h”
void main()
{
int a;
fun(a);
}

由于main.cpp用到了fun(a),所以在编译main.cpp的时候,
编译器知道它要用int来实例化fun(T)中的T,也就是要实例化fun(int),而要实例化一个函数模板就必须要知道这个函数模板的定义,但是由于main.cpp和包含函数模板定义的temp.cpp是分开编译的,所以编译器在编译main.cpp的时候就不能够用int来实例化fun(T),这样编译器就只能够把
fun(a)当成一个外部符号,交由linker来resolve。
另外编译器在编译temp.cpp的时候,同样因为temp.cpp和main.cpp是分开编译的,所以此时编译器并不知道main.cpp中用到了fun(a),所以此时编译器虽然知道函数模板的定义,但也不会去实例化任何fun,当然就不会用int来实例化fun了。
结果就是,你在main.obj引用了外部符号fun,但是在temp.obj中不存在fun,
所以linker就会报告无法解析的外部符号了

通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。

"标准要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;而反过来,在看到实例化模板之前,编译器对模板的定义体是不处理的——原因很简单,编译器怎么会预先知道 typename 实参是什么呢?因此模板的实例化与定义体必须放到同一翻译单元中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值