【C++】模板函数的声明和定义必须在同一个文件中

1、问题描述

习惯性的将函数的定义和实现,分别写在头文件和源文件(.cpp)中。今天也按照这个习惯实现了一个模板函数。然后编译时报错

... error: undefined reference to ...
2、原因分析

c++中模板的声明和定义不能分开。C++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时候,编译器才知道,模板套用的是什么类型,应该分配多少空间。这也就是模板类为什么只是称之为模板,而不是泛型的缘故。
参见博客:https://www.cnblogs.com/jingshikongming/p/9037881.html

3、解决方法

1)将C++模板函数的声明和定义写在头文件中。如果是,类成员函数,可以写在类外面,比较清晰。
2)使用export关键字,在头文件中声明后,在cpp文件中使用export再次修饰下模板函数。但是此方法,不推荐,因为在c++11中已经丢弃不用。
参见:https://zh.cppreference.com/w/cpp/keyword/export

C++ 关键词 export 用法:

C++11 以前:用于标记模板定义为被导出,这允许在其他翻译单元中声明但不定义同一模板。
C++11~C++20:不使用并保留该关键词。
C++20:标记一个声明、一组声明或另一各模块由当前模块所导出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值