关于模板类的函数定义只能写在头文件这事

  猝不及防的编译错误,压根没想过有这么一回事,好吧,还是知识太浅薄

  那究竟是什么原因造成模板函数不能放在cpp文件里定义呢?

  这得从编码到运行探究,先看预编译是将预编译宏命令进行处理,编译是将文本中的源码转换成计算机能直接处理的汇编语言,C++采用的是分离式编译::

c++开发中广泛使用声明和实现分开的开发形式,其编译过程是分离式编译,就是说各个cpp文件完全分开编译,然后生成各自的obj目标文件,最后通过连接器link生成一个可执行的exe文件。引用自:https://blog.csdn.net/uestclr/article/details/51372780

因为是分离式编译,在找不到调用函数的定义时,编译器会将其交给连接器去做,相当于会有个符号记录表(符号导入表),而在函数定义所在的源文件编译完成后会在其中找到相同的函数定义,记录在符号导出表,连接器只要在符号导出表找到对应的函数地址即可,并将地址写入符号导入表

回到模板函数,在分离式编译的环境下,编译器编译某一个 .cpp 文件时并不知道另一个 .cpp 文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接器)。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会实例化出来,所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的 .cpp 文件中没有用到模板的实例时,编译器懒得去实例化,所以,整个工程的 .a 中就找不到一行模板实例的二进制代码,于是连接器也黔驴技穷了。 ----引用:https://www.jianshu.com/p/dc94f0cbfcf7

解决方法:

1.函数定义也写在头文件

2.使用template

posted @ 2022-08-09 12:18  yddl  阅读(487)  评论(0编辑  收藏  举报