c – 具有协变返回类型和模板类参数的虚拟继承,vs2013中的LINK错误

这是我的代码:

#include <vector>
struct A
{
    typedef std::vector<int> vec; //(1) template type
    virtual A& test(vec) = 0; 
};

struct B : public virtual A //(2) virtual inheritance
{
    virtual B& test(vec) override //(3) covariant return type
    {
        return *this;
    }
};

//std::vector<int> vv, cc(vv); //(4) explicit instantiate copy-ctor

int main()
{
    B b;
    b.test({});
}

Visual C 2013给了我一个链接错误.

error LNK2001: unresolved external symbol "public: __thiscall
std::vector<int,class std::allocator<int> >::vector<int,class
std::allocator<int> >(class std::vector<int,class 
std::allocator<int> > const &)"
(??0?$vector@HV?$allocator@H@std@@@std@@QAE@ABV01@@Z)

我试过gcc,然后编译.

如果我执行以下任何一项操作,VC将编译:

>将第(1)行更改为非模板类​​型
>删除行中的“虚拟”(2)
>将退货类型更改为A&在行(3)
>取消注释线(4)

为什么?

最佳答案
这可能确实是一个VC错误; Clang和G都接受这个代码.有趣的是,在下面的B.test()调用中将代码更改为不使用初始化列表也可以消除错误,这使我相信VC的初始化列表支持存在问题导致此问题.

#include <vector>
struct A
{
    typedef std::vector<int> vec; //(1) template type
    virtual A& test(vec) = 0; 
};

struct B : public virtual A //(2) virtual inheritance
{
    virtual B& test(vec) override //(3) covariant return type
    {
        return *this;
    }
};

//std::vector<int> vv, cc(vv); //(4) explicit instantiate copy-ctor

int main()
{
    A::vec v;
    B b;
    //b.test({});
    b.test(v);
}

转载注明原文:c – 具有协变返回类型和模板类参数的虚拟继承,vs2013中的LINK错误 - 代码日志