Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2008外部模板_C++_Templates_Visual Studio Templates - Fatal编程技术网

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&);