暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++模板声明和实现一般要写在一块

嵌入式情报局 2021-09-08
1077
大家好,我是情报小哥!

01

模板与普通实现

前面跟大家介绍了函数模板和类模板,算是模板入门初步,到这里相信大家都明白什么是模板了吧,也应该了解了模板实现的基本原理。一句话:根据模板参数产生对应的数据类型,并进行替换,最后编译链接。

相比普通的成员函数等的实现多了一步根据类型匹配替换的过程,而今天我们聊的这个话题:模板中声明和实现一般都放在一起,其实就是匹配过程需要注意的地方,并且通常我们会把模板的定义和实现都放在头文件中以便使用。

02

CPP编译

一般的类等声明和定义都分别放在相应的.cpp和.h中,而对于模板这样却存在一些问题。首先我们需要了解C++源文件的大致编译过程:

以上是大部分编译器的一个编译过程,相信朋友们也应该看过很多次了,好像挺简单的,不过还是有几点经常犯糊涂的。

首先上面的编译过程都是以一个.cpp作为编译单元 ,但是一个编译单元不仅仅只有一个.cpp文件,还包括其所包含的头文件等,.cpp文件中的头文件最终都会在对应的位置进行展开,因此各.cpp文件在链接之前是相互独立的。

既然包含的头文件都会在每个源文件中进行展开,所以一般都不会在头文件中直接定义变量,容易造成重复定义,同样C语言编译过程也是类似的。

虽然编译的过程似乎很容易理解,需要注意的东西还是挺多的。

03

模板定义与实现分开

前面了解到每个编译单元是相互独立的,那么我们如果把模板的声明和实现分开,使用模板的时候便无法从头文件或者源文件中匹配到相应类型的模板实现,导致找不到具体的定义,既然有了这样的思考,我们就来实验一下是否可行:

上面是类的常规写法 : 把Calc类定义在相应的Calc.cpp和Calc.h中,其他.cpp文件中便可以通过对应类的头文件使用相应的类。
下面我们把它修改为模板的形式,看是否会编译出错:

跟我们之前分析一样,报错,相关函数未定义,并且此时由于模板中没有指定类型并不会进行编译。

04

模板定义与实现处理

前面的分析,既然找不到相应模板的定义,那我们就直接包含.cpp文件,因为#include“XXX.x”没什么稀奇的,其直接会在源文件中展开,C语言中也可以这么玩。
前面的源码中只需要把.h文件改成.cpp,这样由于Calc.cpp展开在编译main.c过程中可以直接找到模板定义并且匹配出对应类型的模板实现,最后编译通过。
而对于.cpp作为源文件在大家心中都根深蒂固了,而此刻作为头文件属实有点碍眼,于是我们会把这样的模板实现文件定义为.hpp,并且加上重复包含预编译,如下代码所示:

这样应该强迫症好多了,编译OK,enjoy~

最  后 


这里小哥就介绍了一下C++中类模板编写的注意事项,希望本文能够对你有帮助,该系列还会持续更新,大家可以持续关注~

查看更多,可以在公众号内回复"1024"即可获取~

推荐好文  点击蓝色字体即可跳转


☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

专辑|从单片机到Linux

☞ 专辑|电能控制技术

文章转载自嵌入式情报局,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论