VS2008 extern模板

时间:2010-11-23 19:10:40

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

Microsoft有一个extension,可以声明模板实例化是外部的;因此,它不会被隐式实例化。至少那是理论。我尝试使用代码

重现它
#include <vector>

class Foo{
    int i;
public:
    virtual ~Foo();
};

extern template class std::vector<Foo>;

这给了我

warning C4231: nonstandard extension used : 'extern' before template 
explicit instantiation

但是,似乎没有其他事情发生:程序继续链接find,即使我使用push_back(并且dumpbin显示push_back已实例化)。

只有当我宣布

extern template void std::vector<Foo>::push_back(const Foo&);

我按预期收到链接器错误。

那么:如何将整个实例化(所有成员)声明为显式,以防止隐式实例化?

1 个答案:

答案 0 :(得分:6)

我认为你在扩展的文档中被这个注释所困扰:

  

专业化中的extern关键字仅适用于在类主体外部定义的成员函数。在类声明中定义的函数被视为内联函数,并且始终被实例化。

vector::push_back()(以及大多数或所有std :: vector&lt;&gt;模板)在类声明中定义。

考虑到说明的内容,成员函数上的extern似乎仍然会导致实例化,但是这个扩展未被记录或指定不足也不会感到惊讶。

我怀疑如果不对每个成员函数执行显式extern,您将无法执行所需操作。