代码之家  ›  专栏  ›  技术社区  ›  Martin v. Löwis

VS2008外部模板

  •  3
  • Martin v. Löwis  · 技术社区  · 14 年前

    微软有一个 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&);
    

    我得到一个链接器错误,如预期。

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

    1 回复  |  直到 14 年前
        1
  •  6
  •   Michael Burr    14 年前

    我想你在分机的文件里被这张字条咬了一口:

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

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

    根据纸条上写的,看起来 extern 在成员函数上仍应导致实例化,但对于此扩展未被记录或未被指定,并不感到意外。

    我想如果你不直截了当地说 外部 在每个成员函数上。