【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:标记一个声明、一组声明或另一各模块由当前模块所导出。

你可能感兴趣的:(C++)