【发布时间】:2011-12-19 11:46:13
【问题描述】:
我有带有模板的工作代码。与 stl::string 类似,我主要在多个编译单元中使用带有一个参数的模板。为了节省时间,我尝试使用 extern 实例化。但是,如下更改行会产生错误。正确的方法是什么? (P.S. 使用 c++0x 标志在 gcc 上编译)
typedef myTemplate_base<commonType> myTemplate;
extern template class myTemplate_base<commonType>; //using "extern template myTemplate" wont work
我在项目中添加了一个包含以下内容的额外 cpp 文件。
template class myTemplate_base<commonType>;
链接器出现此错误消息(将主文件中第一个对象实例化 (myTemplate someVar;) 的行作为错误源):
未定义的引用'myTemplate_base::~myTemplate_base()'
但是这个类型在类中,定义如下~myTemplate() = default;
编辑:如果您有更好的标题,请发表评论,让合适的人看看这个
Edit2: 有趣的是,添加template class myTemplate_base<commonType> 极大地增加了可执行文件的大小(在 450k 的二进制文件上增加了 100k),即使在主文件中使用了模板(编译 I必须将extern 部分注释掉)。这暗示链接器保留了具有相同实例化的模板的两个实现/我忽略了某些东西。
【问题讨论】:
-
可能值得说明您正在使用哪个版本的 gcc 以及您正在使用的任何其他编译器标志。编译器标志可能会导致任何代码膨胀。您能否也发布这 2 个文件的精简来源,以供人们自己编写。
-
因为我现在不在正确的电脑上,所以我可以告诉你,我使用的是与代码块中的 ubuntu 11.10 一起打包的 gcc。一回到另一台电脑,我就会写下实际的版本号和一些示例代码。希望我错过了一些明显的东西。
标签: c++ templates linker c++11