将 std:vector<reference_wrapper<Base>> 转换为 std:vector<reference_wrapper<Derived>

Transform std:vector<reference_wrapper<Base>> to std:vector<reference_wrapper<Derived>> Runtime error time: 0 memory: 3412 signal:6

本文关键字:lt gt wrapper reference std vector Derived Base 转换      更新时间:2023-10-16

我正在尝试将对Base对象的引用向量转换为对Derived对象的引用矢量。一切都编译得很好,但我得到了这个错误:运行时错误时间:0内存:3412信号:6

这是我的代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct B {
    B(int i) { b = i; }
    virtual ~B() {}
    int b;
};
struct D: public B {
    D(int i): B(i) {}
};
typedef vector<reference_wrapper<B>> refB;
typedef vector<reference_wrapper<D>> refD;
void dynamicCast(refB &b, refD &d)
{
    for(const auto& bb: b)
    {
        d.push_back(dynamic_cast<D&> (bb.get()));
    }
}
int main() {
    vector<B*> numbers;
    refB refNumbers;
    refD dNumbers;
    for(int i = 0; i < 10; i++)
    {
        numbers.push_back(new B(2*i));
        refNumbers.push_back(*numbers[i]);
    }
    dynamicCast(refNumbers, dNumbers);
    return 0;
}

dynamicCast()函数有什么问题?

编辑:@John Zwinck的回答有帮助,但当我试图在代码中这样做时,我得到了编译错误:

无法dynamic_cast'(&obj)->std::reference_wrapper&lt_Tp>::get()'(类类型)MEPObject)类型为'class MEPGene&'(目标不是指针或参考完整类型)genes.push_back(dynamic_cast(obj.get()));

class MEPObject;
class MEPGene;
typedef std::vector<std::reference_wrapper<MEPObject>> MEPObjects;
typedef std::vector<std::reference_wrapper<MEPGene>> MEPGenes;
void dynamicCast(MEPObjects &objects, MEPGenes &genes)
{
    for(const auto &obj: objects)
    {
        genes.push_back(dynamic_cast<MEPGene&> (obj.get()));
    }
}
                                                      ^

dynamicCast()没有任何问题。问题就在这里:

    numbers.push_back(new B(2*i));

您只能构造作为基类的B的实例。您不可能将它们强制转换为作为派生类的D

也许您打算构建派生实例,并将它们存储在对base的引用向量中。