<tfoot id='CkWRD'></tfoot>

<small id='CkWRD'></small><noframes id='CkWRD'>

    <legend id='CkWRD'><style id='CkWRD'><dir id='CkWRD'><q id='CkWRD'></q></dir></style></legend>

      • <bdo id='CkWRD'></bdo><ul id='CkWRD'></ul>
    1. <i id='CkWRD'><tr id='CkWRD'><dt id='CkWRD'><q id='CkWRD'><span id='CkWRD'><b id='CkWRD'><form id='CkWRD'><ins id='CkWRD'></ins><ul id='CkWRD'></ul><sub id='CkWRD'></sub></form><legend id='CkWRD'></legend><bdo id='CkWRD'><pre id='CkWRD'><center id='CkWRD'></center></pre></bdo></b><th id='CkWRD'></th></span></q></dt></tr></i><div id='CkWRD'><tfoot id='CkWRD'></tfoot><dl id='CkWRD'><fieldset id='CkWRD'></fieldset></dl></div>

    2. 尝试从 Derived* 的向量中分配 Base* 的向量

      时间:2023-10-07
        <tbody id='5aqtL'></tbody>
      <i id='5aqtL'><tr id='5aqtL'><dt id='5aqtL'><q id='5aqtL'><span id='5aqtL'><b id='5aqtL'><form id='5aqtL'><ins id='5aqtL'></ins><ul id='5aqtL'></ul><sub id='5aqtL'></sub></form><legend id='5aqtL'></legend><bdo id='5aqtL'><pre id='5aqtL'><center id='5aqtL'></center></pre></bdo></b><th id='5aqtL'></th></span></q></dt></tr></i><div id='5aqtL'><tfoot id='5aqtL'></tfoot><dl id='5aqtL'><fieldset id='5aqtL'></fieldset></dl></div>

    3. <legend id='5aqtL'><style id='5aqtL'><dir id='5aqtL'><q id='5aqtL'></q></dir></style></legend>

        <small id='5aqtL'></small><noframes id='5aqtL'>

        <tfoot id='5aqtL'></tfoot>

        • <bdo id='5aqtL'></bdo><ul id='5aqtL'></ul>

              • 本文介绍了尝试从 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.

                推荐答案

                那是因为 BaseDerived 有关系,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* 的向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:我可以创建一个线程安全的 std::atomic<vector< 下一篇:C++:打开视频文件最简单的库是什么

                相关文章

                最新文章

                <i id='QMAmO'><tr id='QMAmO'><dt id='QMAmO'><q id='QMAmO'><span id='QMAmO'><b id='QMAmO'><form id='QMAmO'><ins id='QMAmO'></ins><ul id='QMAmO'></ul><sub id='QMAmO'></sub></form><legend id='QMAmO'></legend><bdo id='QMAmO'><pre id='QMAmO'><center id='QMAmO'></center></pre></bdo></b><th id='QMAmO'></th></span></q></dt></tr></i><div id='QMAmO'><tfoot id='QMAmO'></tfoot><dl id='QMAmO'><fieldset id='QMAmO'></fieldset></dl></div>

                • <bdo id='QMAmO'></bdo><ul id='QMAmO'></ul>

                1. <legend id='QMAmO'><style id='QMAmO'><dir id='QMAmO'><q id='QMAmO'></q></dir></style></legend>

                    <tfoot id='QMAmO'></tfoot>
                  1. <small id='QMAmO'></small><noframes id='QMAmO'>