【问题标题】:Using extern template class with STL classes将外部模板类与 STL 类一起使用
【发布时间】:2013-07-31 16:06:41
【问题描述】:

我试图将 std::map、std::multimap 和 std::vector 的某些模板实例化限制为仅一个目标文件,以尝试改进编译和链接时间。据我了解,我不能简单使用的原因

#include <vector>
extern template class std::vector<int>;
std::vector<int> myobj;

是VS10的头文件包含所有成员的定义,所以编译器将它们视为内联,并且无论如何都要实例化。如果我要从标头中删除所有函数体,我的假设是否正确?如果是这样,是否有人碰巧已经有这样的标题,并且能够分享它?

我也试过列出一些这样的成员

extern template std::vector<int>::vector(); // works
extern template std::vector<int>::~vector(); // no effect

当 ctor 被移除时,dtor 仍然根据dumpbin 定义。这是什么原因?是不是因为某种原因,dtor 被认为是内联的,而 ctor 不是?

【问题讨论】:

  • 在包括 VS 2017 在内的 Visual Studio 编译器中的 STL 实现仍然会出现同样的问题。在 Visual Studio 中无法将 extern 模板与 STL 类一起使用。
  • 模板应该在头文件中实现,但是,为了使外部模板生效,方法定义需要移到类体之外(通常在同一个头文件中,之后的某个位置类的主体)。

标签: c++ visual-studio-2010 templates


【解决方案1】:

根据标准,STL 数据结构在头文件中实现,因此这不是 VS10 特定的。为什么要限制为只有一个目标文件?

在头文件和源文件之间拆分模板存在问题 - 你可以搜索。

【讨论】:

  • 我想改进我们的编译和链接时间。
  • 使用预编译头文件并将 STL 头文件放入其中。
  • 我认为编译速度慢是由其他因素造成的。头文件中有函数体吗?你使用类的前向声明吗?
猜你喜欢
  • 2014-06-13
  • 2017-07-04
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多