环境参数
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将其称作是“单独编译模型”(separate compilation model)。
举个例子

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

1万+

被折叠的 条评论
为什么被折叠?



