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)
我按预期得到链接器错误.
那么:我如何将整个实例化(所有成员)声明为显式,以防止隐式实例化?
我认为你在扩展的文档中被这个注释所困扰:
专业化中的extern关键字仅适用于在类主体外部定义的成员函数.在类声明中定义的函数被视为内联函数,并且始终被实例化.
vector::push_back() (以及大多数或所有std :: vector <>模板)在类声明中定义.
鉴于注释所说的内容,似乎extern成员函数仍然应该导致实例化,但是这个扩展未被记录或指定不足也不会感到惊讶.
我怀疑如果不对extern每个成员函数进行显式操作,你将无法做你想做的事情.