首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用extern模板

如何使用extern模板
EN

Stack Overflow用户
提问于 2011-07-29 09:02:28
回答 1查看 11.4K关注 0票数 24

我一直在浏览N3291的C++0x工作草案。我对外型模板很好奇。第14.7.3节规定:

除了内联函数和类模板专门化之外,显式实例化声明的效果是抑制它们所引用的实体的隐式实例化。

FYI:术语“显式实例化声明”是extern template的标准语言。这是在第14.7.2节中界定的。

这听起来像是在说,如果您使用extern template std::vector<int>,那么执行通常隐式实例化std::vector<int>的任何事情都不会这样做。

下一段更有趣:

如果实体是同一翻译单元中显式实例化声明和显式实例化定义的主题,则定义应遵循声明。一个实体是显式实例化声明的主题,并且也是以一种在翻译单元中会导致隐式实例化(14.7.1)的方式使用的,它应该是程序中某个地方显式实例化定义的主题;否则程序是不正确的,不需要诊断。

FYI:术语“显式实例化定义”是这些事情的标准表述:template std::vector<int>。也就是说,没有extern

对我来说,这两件事表明extern template阻止隐式实例化,但它不阻止显式实例化。所以如果你这么做

代码语言:javascript
复制
extern template std::vector<int>;
template std::vector<int>;

第二行通过显式地执行第一行避免隐式发生的操作,从而有效地否定了第一行。

问题是: Visual 2008似乎不太一致。我想使用extern template的方式是防止用户隐式实例化某些常用的模板,这样我就可以在.cpp文件中显式地实例化它们以减少编译时间。模板将只实例化一次。

问题是,我必须在VS2008中与他们打交道。因为如果一个翻译单元看到extern和非extern版本,它将使extern版本获胜,没有人会实例化它。然后是链接器错误。

所以,我的问题是:

  1. ,根据C++0x,正确的行为是什么?extern template是否应该阻止显式实例化?如果对前一个问题的回答是不应该的,那么VS2008就出错了(当然,它早在规范之前就写好了,所以这不是他们的错)。VS2010是如何处理这个问题的?它是否实现了正确的extern template行为?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-29 13:11:38

上面写着

,除...class模板专门化外

因此,它不适用于std::vector<int>,而适用于其成员(不是内联成员函数的成员,也可能不是嵌套类。不幸的是,没有一个术语同时捕捉到“类模板专门化和类模板成员类的专门化”。因此,有些地方只使用前者,但也包括后者)。因此,如果需要,std::vector<int>及其嵌套类(如std::vector<int>::iterator,如果定义为嵌套类)仍将被隐式实例化。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6870885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档