0

プロジェクトの大規模なリファクタリングを行って、現在の基本クラスの派生クラスの代わりに基本クラスを追加しました (このクラスの「タイプ」がもっと必要なため)。

私の問題は、一部のユーティリティ関数が元のクラス A の参照を shared_ptr として受け取るため、関数宣言が次のようになることです。

void UtilityClass::func(shared_ptr<A> &a);

しかし、新しい基本クラス B があり、A が B から派生した (および B から派生した新しいクラス C) ため、A または C のインスタンスを渡そうとすると、コンパイル時エラーが発生します。宣言が次の関数に:

void UtilityClass::func(shared_ptr<B> &b);

私が試してみると:

shared_ptr<A> a;
utilclass.func(a);

コンパイル時に次のようなエラーが表示されます (言い換え):

パラメータ 1 を 'std::shared_ptr<_Ty>' から 'std::shared_ptr<_Ty>' に変換できません

しかし、他にこの問題を解決する方法がわかりません。 func() は A、B、または C インスタンスを shared_ptr 値の std::vector に追加します。

御時間ありがとうございます。

編集: B の新しいインスタンスを割り当ててから返すことができるように、参照を取る別の関数もあります。

4

4 に答える 4

6

問題は、非参照で渡していることです。constつまり、引数の型を正確に一致させる必要があります。

const関数を変更して、値または参照によってポインターを取得します。次に、暗黙的な変換 ( shared_ptr<Derived>toなどshared_ptr<Base>) を引数に適用できます。

于 2013-08-01T13:19:15.233 に答える
0

これは機能します:

class A {
public:
    virtual ~A() {};
    virtual void print() {
        puts("A prints");
    }
};
class B: public A {
public:
    void print() {
        puts("B prints");
    }
};


void func(std::shared_ptr<A> a) {
    a->print();
}


int main()
{
    std::shared_ptr<A> b_1(new B()); // can hold B*
    std::shared_ptr<B> b_2(new B());

    // both next function calls print "B prints"
    func(b_1);
    func(b_2); // can accept std::shared_ptr<B>
}
于 2016-05-04T03:15:43.250 に答える