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