2017-08-31 5 views
1

私は、オーバーロードされたメソッドを持つクラスを持っています。特定のサブクラスは、これらの型の両方を継承します。それは、static_cast<class>(obj)あいまいなオーバーロード関数呼び出しのデフォルトの作成

struct A {}; 
struct B { 

    void foo(const A) { 
    /*impl*/ 
    } 

    void foo(const B) { 
    /*impl*/ 
    } 
}; 

struct C : A, B { 

}; 

int main() { 
    C c; 
    B b; 
    b.foo(c); //ambiguous 
} 

を呼び出すすることを避けるために、デフォルトのメソッド呼び出しを設定することが可能である特定のメソッドの呼び出しに、コンパイラのデフォルトを持ってする方法はありますか?

*巧妙で洗練された回避策が受け入れられました。

+2

'void foo(const C)'を宣言して、デフォルトのものを呼び出すことはできますか? – wally

+0

申し訳ありませんが、fooはスーパークラスからのメソッド呼び出しで、Cはサブクラスです。私はこれを紹介するために私の質問を編集します。 –

+0

おそらく、あなたのサンプルを投稿する前にそれをコンパイルしてみてください。多くの構文エラーがあり、 'foo'はメンバ関数であればそのように呼び出すことができないので、今混乱しています。 – wally

答えて

1

あなたはあなたのためstatic_castを行うと、デフォルトを呼び出すためにテンプレートを使用することができます。

struct A {}; 
struct B { 

    template<typename T> 
    void foo(T& t) { 
     foo(static_cast<A&>(t)); 
    } 

    void foo(const A) { 
     /*impl*/ 
    } 

    void foo(const B) { 
     /*impl*/ 
    } 
}; 

struct C : A, B { 

}; 

int main() { 
    C c; 
    B b; 
    b.foo(c); //eventually calls foo(A) 
} 

しかし、その後、再び、それだけでCを取るメンバ関数を宣言する方が簡単かもしれません。

+0

投票しました。あなたはダイヤモンドブラケットを使用せずにこの方法でテンプレートを利用することができたことに気付かなかった。私はstatic_castや<>を必要としないので、きれいな表記の目的のためには素晴らしいです(演算子を持つ)数学ライブラリを書いています。 ありがとう –

関連する問題