不能将模版类的定义与实现分别写在header文件和cpp文件中

本文探讨了为何在C++中不能将模板类的定义与实现分开放在不同的文件中。起因是在macOS环境下使用Clion和Cmake时遇到编译错误。原因在于模板并非实际的对象,而是编译器生成类或方法的模式,因此需要模板的完整定义(包括方法实现)和实例化类型。由于编译器遵循单独编译模型,所以在编译每个源文件时,若缺失模板实现会导致编译失败。
摘要由CSDN通过智能技术生成

环境参数

  • macOS 10.13.3

  • clion 2017.3

  • cmake 3.9


起因

在编写cpp程序时将一个模版类的定义写在了header文件中,而其方法的实现写在了另一份cpp文件中,结果使用IDE运行时报错,“Undefined symbols for architerture x86_64: ……“ 大意是无法找到对象的方法,如下图:

这里写图片描述


原因

在网上到处搜资料,最后终于找到原因了:不可以将模版类的定义与实现写在不同的文件当中,原因如下:

  • 1# template(模版)并不是一个类或者方法。 template 的作用是提供给编译器生成类或方法的一个模式(pattern)。

  • 2# 为了可以让编译器正确成相应的代码,必须有模版的定义(并不仅仅是声明,也就是不仅仅是header文件中的方法声明,还要有cpp文件中方法的具体实现)以及具体向模版中填充的类型(比如int),二者缺一不可。

  • 3# 你的编译器不会在编译一份文件的同时记得另一份文件的内容。BTW将

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值