VS2008 extern模板

Mar*_*wis 3 c++ templates visual-studio-templates

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

#include <vector>

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

extern template class std::vector<Foo>;
Run Code Online (Sandbox Code Playgroud)

这给了我

warning C4231: nonstandard extension used : 'extern' before template 
explicit instantiation
Run Code Online (Sandbox Code Playgroud)

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

只有当我宣布

extern template void std::vector<Foo>::push_back(const Foo&);
Run Code Online (Sandbox Code Playgroud)

我按预期得到链接器错误.

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

Mic*_*urr 6

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

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

vector::push_back() (以及大多数或所有std :: vector <>模板)在类声明中定义.

鉴于注释所说的内容,似乎extern成员函数仍然应该导致实例化,但是这个扩展未被记录或指定不足也不会感到惊讶.

我怀疑如果不对extern每个成员函数进行显式操作,你将无法做你想做的事情.