C++ 尝试从派生的向量指定基*的向量*

C++ 尝试从派生的向量指定基*的向量*,c++,pointers,inheritance,vector,C++,Pointers,Inheritance,Vector,这似乎是一个相当基本的问题,但我无法解决。我有一个指向派生对象的原始指针的std::vector,我只想使用赋值运算符将它复制到另一个基指针向量。使用VC++时,出现错误C2679“binary'=':未找到运算符…”顺便说一句,我不想要对象的深度副本,我只想复制指针。示例代码: #include <vector> using namespace std; struct Base{}; struct Derived: public Base {}; int main (i

这似乎是一个相当基本的问题,但我无法解决。我有一个指向派生对象的原始指针的
std::vector
,我只想使用赋值运算符将它复制到另一个基指针向量。使用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\u-back
执行元素转换。赋值运算符仅存在于相同类型的向量之间

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

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

这是因为虽然
Base
Derived
有关系,但
vector
vector
之间没有关系。就类层次结构而言,它们是完全不相关的,因此不能将一个分配给另一个

您正在寻找的概念称为。例如,在Java中,
String[]
Object[]
的一个子类型。但是在C++中,这两种类型只是不同的类型,它们与<代码>字符串[]/COD>和<代码> BAR< /COD>无关。p>
push_-back
有效,因为该方法只需要一个
T常量&
(或
T&
),所以任何可转换为
基*
的东西都是可以接受的,而
派生*
就是这样

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

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

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

template <typename T> struct Foo {};
模板结构Foo{};
Foo
不是
Foo
的基类

因此,您不能:

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

我想如果赋值操作符必须接受不同但相关类型的向量,它会变得过于复杂。这也是一个(非常常见的)C++常见问题解答。请参阅。在C#
中,列表
也与
列表
无关,但是
IEnumerable
IEnumerable
的一个子类型,因为
IEnumerable
是变量。@usr协变的。与常见问题解答示例一起,这并不违反类型安全性,因为
IEnumerable
是只读接口,因此不能破坏
向量。然而,我们可以想象在一个系统中,
向量
仍然是不变的,但是存在一个
常数向量
,它可能是协变的。
template <typename T> struct Foo {};
Foo<Derived> f1;
Foo<Base> f2 = f1;