试图从Derived *的向量中分配Base *的向量

时间:2015-04-07 14:52:41

标签: c++ pointers inheritance vector

这似乎是一个非常基本的问题,但我无法弄清楚。我有一个std::vector Derived对象的原始指针,我只想使用赋值运算符将它复制到另一个Base指针向量。使用VC ++我得到错误C2679“binary'=':没有找到操作符......”顺便说一下,我不想要对象的深层副本,我只是想复制指针。示例代码:

#include <vector>
using namespace std;

struct Base{};    
struct Derived: public Base {};

int main (int argc, char* argv[])
{
    vector<Derived*> V1;
    vector<Base*> V2;
    V2 = V1;  //Compiler error here
    return 0;
}

令我困惑的是,我可以通过循环并使用push_back来复制矢量,如下所示:

for (Derived* p_derived : V1)
    V2.push_back(p_derived);

所以我的问题是为什么分配失败,而push_back有效?对我来说似乎是一样的东西。

3 个答案:

答案 0 :(得分:20)

这是因为BaseDerived有关系,vector<Base*>vector<Derived*>之间没有任何关系。就类层次结构而言,它们完全不相关,因此您无法将其分配给另一个。

您正在寻找的概念称为covariance。例如,在Java中,String[]Object[]的子类型。但是在C ++中,这两种类型只是不同的类型,并不比String[]Bar更相关。

push_back有效,因为该方法只需T const&(或T&&),因此任何可转换为Base*的内容都可以接受 - Derived*

那就是说,vector有一个带有一对迭代器的构造函数,在这里应该更容易使用:

vector<Base*> v2(v1.begin(), v1.end());

或者,因为它已经构建:

v2.assign(v1.begin(), v1.end());

答案 1 :(得分:9)

push_back执行元素转换。赋值运算符仅存在于相同类型的向量之间。

一个简单的解决方案是使用assign

v2.assign(v1.begin(), v1.end());

答案 2 :(得分:2)

在模板的一般情况下,如果您有一个类模板

template <typename T> struct Foo {};

Foo<Base>不是Foo<Derived>的基类。

因此,你做不到:

Foo<Derived> f1;
Foo<Base> f2 = f1;