Trying to assign vector of Base* from vector of Derived*(尝试从 Derived* 的向量中分配 Base* 的向量)
问题描述
这似乎是一个非常基本的问题,但我无法弄清楚.我有一个 std::vector 指向派生对象的原始指针,我只想使用赋值运算符将它复制到另一个 Base 指针向量.使用 VC++ 我得到错误 C2679二进制'=:没有找到运算符..."顺便说一句,我不想复制对象的深层副本,我只想复制指针.示例代码:
This seems like a pretty basic problem, but I can't figure it out. I have a std::vector of raw pointers to Derived objects, and I just want to copy it to another vector of Base pointers using the assignment operator. With VC++ I get error C2679 "binary '=': no operator found..." BTW I don't want a deep copy of the objects, I just want to copy the pointers. Sample code:
#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 来复制向量,如下所示:
What confuses me is that I can copy the vector by looping through it and using push_back, like this:
for (Derived* p_derived : V1)
V2.push_back(p_derived);
所以我的问题是为什么分配失败,而 push_back 有效?对我来说似乎是一样的.
So my question is why does the assignment fail, while push_back works? Seems like the same thing to me.
推荐答案
那是因为 Base 和 Derived 有关系,vector< 没有关系;Base*> 和 vector.就类层次结构而言,它们完全不相关,因此您不能将一个分配给另一个.
That's because while Base and Derived have a relationship, there is no relationship between vector<Base*> and vector<Derived*>. As far as class hierarchy is concerned, they are entirely unrelated, so you can't assign one to the other.
您正在寻找的概念称为协方差.例如,在 Java 中,String[] 是 Object[] 的子类型.但是在 C++ 中,这两种类型只是不同的类型,与 String[] 和 Bar 没有什么关系.
The concept you are looking for is called covariance. In Java for instance, String[] is a subtype of Object[]. But in C++, these two types are just different types and are no more related than String[] and Bar.
push_back 有效,因为该方法只需要一个 T const&(或 T&&),所以任何可以转换为 Base* 是可以接受的 - Derived* 是.
push_back works because that method just takes a T const& (or T&&), so anything convertible to a Base* will be acceptable - which a Derived* is.
也就是说,vector 有一个带有一对迭代器的构造函数,在这里应该更容易使用:
That said, vector has a constructor that takes a pair of iterators, which should be easier to use here:
vector<Base*> v2(v1.begin(), v1.end());
或者,因为它已经构建:
Or, since it is already constructed:
v2.assign(v1.begin(), v1.end());
这篇关于尝试从 Derived* 的向量中分配 Base* 的向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:尝试从 Derived* 的向量中分配 Base* 的向量
基础教程推荐
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 常量变量在标题中不起作用 2021-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 这个宏可以转换成函数吗? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
