C++中使用函数模板出现“无法解析的外部符号”问题

本文探讨了在C++中函数模板实例化的问题,特别是在不同编译单元间的链接问题。介绍了函数模板的工作原理,即在使用时才进行实例化,并解释了为何在不同编译单元中会出现未解析的外部符号错误。提供了将类模板声明和定义置于同一.h文件中的解决方案。

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

在写程序中使用了函数模板 template<typename T> 之前运行过程没有什么问题,当我把函数放到另一个编译单元之后出现了“无法解析的外部符号”问题。原因就出在类模板上。

首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件。不同的cpp文件是分开编译的。再由连接器(linker)进行连接成为一个.exe文件。

在函数模板所包含的cpp文件中,如果没有对此模板进行实例化的过程,所编译的obj文件没有对类模板进行实例化,主函数的cpp文件也不会对此类模板进行实例化。也就不会生成二进制文件。

也就是说

template<typename T>

T test(T a,T b){ }

在编译过程只有在同一个cpp文件及其include的文件中有引用函数模板的过程,函数模板才会转化成对应的函数。比如有int test(1,3),这个时候编译的过程中就会生成int test(int ,int)这个函数,如果没有函数模板调用的过程,就不会生成任何函数。

 

解决方法:

  1. 将类的声明和定义放在同一个.h文件中。
  2. 在类模板出现的cpp文件对应的.h文件中include  .cpp文件。
  3. 在主函数所在的main.h中include  .cpp文件。

 

参考:

更详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值