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* 的向量
				
        
 
            
        - 使用/clr 时出现 LNK2022 错误 2022-01-01
 - C++ 协变模板 2021-01-01
 - 从python回调到c++的选项 2022-11-16
 - Stroustrup 的 Simple_window.h 2022-01-01
 - STL 中有 dereference_iterator 吗? 2022-01-01
 - 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
 - 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
 - 如何对自定义类的向量使用std::find()? 2022-11-07
 - 近似搜索的工作原理 2021-01-01
 - 静态初始化顺序失败 2022-01-01
 
						
						
						
						
						
				
				
				
				