3

微软有一个扩展,可以声明模板实例化是外部的;因此,它不会被隐式实例化。至少理论是这样的。我尝试用代码复制它

#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

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

只有当我宣布

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

正如预期的那样,我得到一个链接器错误。

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

4

1 回答 1

6

我认为您被扩展文档中的此注释所困扰:

特化中的 extern 关键字仅适用于在类主体之外定义的成员函数。在类声明中定义的函数被认为是内联函数并且总是被实例化。

vector::push_back()(以及大部分或全部 std::vector<> 模板)在类声明中定义。

鉴于注释所说的extern内容,成员函数的 on 似乎仍应导致实例化,但对于此扩展的文档不足或未指定不足,我们不会感到惊讶。

extern我怀疑如果不对每个成员函数 进行显式处理,您将无法做您想做的事情。

于 2010-11-23T19:29:43.917 回答