微软有一个 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&);
我得到一个链接器错误,如预期。
那么:我如何声明整个实例化(所有成员)为显式,防止隐式实例化?
我想你在分机的文件里被这张字条咬了一口:
专门化中的extern关键字仅适用于在类主体外部定义的成员函数。类声明中定义的函数被视为内联函数,并且总是被实例化。
vector::push_back() (以及大部分或全部std::vector<gt;模板)在类声明中定义。
vector::push_back()
根据纸条上写的,看起来 extern 在成员函数上仍应导致实例化,但对于此扩展未被记录或未被指定,并不感到意外。
extern
我想如果你不直截了当地说 外部 在每个成员函数上。
外部