这似乎是一个非常基本的问题,但我无法弄清楚。我有一个 std::vector
指向派生对象的原始指针,我只想使用赋值运算符将它复制到另一个基指针 vector 。使用 VC++ 我得到错误 C2679 "binary '=': no operator found..."BTW 我不想要对象的深层拷贝,我只想复制指针。示例代码:
#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
来复制 vector ,如下所示:
for (Derived* p_derived : V1)
V2.push_back(p_derived);
所以我的问题是为什么分配失败,而 push_back
有效?对我来说似乎是同样的事情。
最佳答案
那是因为虽然 Base
和 Derived
有关系,没有关系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());
关于c++ - 试图从 Derived* 的 vector 中分配 Base* 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29494590/