C++ VS2008外部模板
微软有一个可以声明模板实例化是外部的;因此,它不会隐式实例化。至少这是理论。我试着用代码复制它C++ VS2008外部模板,c++,templates,visual-studio-templates,C++,Templates,Visual Studio Templates,微软有一个可以声明模板实例化是外部的;因此,它不会隐式实例化。至少这是理论。我试着用代码复制它 #include <vector> class Foo{ int i; public: virtual ~Foo(); }; extern template class std::vector<Foo>; 然而,似乎没有发生其他事情:程序继续链接find,即使我使用push_back(dumpbin显示push_back是实例化的) 只有当我申报时 ext
#include <vector>
class Foo{
int i;
public:
virtual ~Foo();
};
extern template class std::vector<Foo>;
然而,似乎没有发生其他事情:程序继续链接find,即使我使用push_back(dumpbin显示push_back是实例化的)
只有当我申报时
extern template void std::vector<Foo>::push_back(const Foo&);
外部模板void std::vector::push_back(const Foo&);
我得到了预期的链接器错误
那么:我如何才能将整个实例化(所有成员)声明为显式的,从而防止隐式实例化呢?我想您已经被扩展文档中的这条注释咬到了: 专门化中的extern关键字仅适用于在类主体外部定义的成员函数。类声明中定义的函数被视为内联函数,并且总是实例化
vector::push_back()
(以及大部分或全部std::vector模板)在类声明中定义
根据注释所述,似乎成员函数上的extern
仍然会导致实例化,但对于该扩展没有得到充分的文档化或指定,这并不奇怪
我怀疑如果不对每个成员函数执行显式的
extern
,您将无法执行所需的操作 我明白了。每次读课文时,我都设法忽略了这张便条。
extern template void std::vector<Foo>::push_back(const Foo&);