0

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<_Tp>::get()' (タイプ 'class 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()));
    }
}
                                                      ^
4

1 に答える 1

1

に問題はありませんdynamicCast()。問題はここにあります:

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

B基本クラスであるインスタンスのみを構築します。D派生クラスにキャストすることはできません。

おそらく、派生インスタンスを構築し、base への参照のベクトルに格納するつもりだったのでしょう。

于 2016-08-02T21:38:54.437 に答える