关于cpp中的template多文件限制

本文探讨了C++中模板声明与实现分离的问题。详细解释了为何模板的定义必须与声明位于同一编译单元内,以及如何正确地在不同文件间使用模板,避免链接错误。

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

记得以前看到过关于cpp中的template不能将声明与实现分开的说明,但是今天看别人代码时发现又是可以的,觉得很奇怪,自己去查了一下cpp标准的说明,

Because templates are compiled when required, this forces a restriction for multi-file projects: the implementation
(definition) of a template class or function must be in the same file as its declaration. That means that we cannot
separate the interface in a separate header file, and that we must include both interface and implementation in any
file that uses the templates.

这是为什么呢?

其实正解应该是这样的,所谓多文件其实是以编译单位来说的,而头文件根本不算是一个编译单位,它只是作为附属被include进来而已,因此这个限制是说,如果在A.cpp里实现了一个模板方法(或者类),那么如果需要在B.cpp里调用这个方法或者类,那么就会出现链接错误,因为链接器不知道跟谁链接。但是如果你只是在同一个编译单元里使用的话,那是没有任何问题的。比如你可以在A.hpp里声明一个模板函数,而在A.cpp里实现它,但是只要你不需要在别的文件(比如B.cpp)里使用这个方法,那是没有任何问题的。可是你一旦使用了这个方法,那就会报链接错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值