5

以下のコードでは、「適用」の呼び出しがあいまいであると報告される理由がわかりません。指定されたパラメーター ( ) に対して受け入れ可能な一致は 1 つだけA_applicator::applyです。このあいまいさの原因となる解決の流れを判断するのに役立つ標準への参照をいただければ幸いです。

struct A { };
struct B { };
struct A_D : public A { };

struct A_applicator {
    virtual void apply( A ) { }
};
struct B_applicator {
    virtual void apply( B ) { }
};
struct dual_applicator : public B_applicator, public A_applicator {
};

int main() {
    dual_applicator app;
    A_D d;
    app.apply(d);
}

(オンラインデモ)

4

2 に答える 2

6

引数の型に基づいて、関数の 1 つを呼び出すことができないため、あいまいであってはならないと考えているようです。しかし、それは C++ の名前解決のしくみではありません。

多かれ少なかれ、これがどのように機能するかです。関数の名前はオーバーロード セットに解決されます。次に、引数リストを使用して、そのセット内の関数から選択します。

あなたの問題は、最初のステップを実行できないことです。これは、名前のapply使用方法が 2 つの異なるオーバーロード セットを参照する可能性があり、コンパイラがどちらを使用するかを認識していないためです。パラメータを調べ始めてもいませんでした。

解決策は簡単です:

A) 欲しい機能を言ってください:

app.A_applicator::apply(d);

B)usingメンバー関数の統一されたオーバーロード セットを構築するために使用するため、引数を使用した予想される解決が使用されます。

struct dual_applicator : public B_applicator, public A_applicator {
    using A_applicator::apply;
    using B_applicator::apply;
};
于 2013-06-15T08:47:43.980 に答える
0

クラスdual_applicatorは仮想関数をオーバーライドしませんapply

于 2013-06-15T08:34:59.493 に答える