型が重複する多重継承における曖昧さ回避
異なる基本クラスに重複しないセットがある場合、多重継承により曖昧なクラス メンバー呼び出しが発生する可能性があります。多態性メソッドに適用可能な型のリスト。可変長基底クラス テンプレート Base がメソッド foo() を定義するシナリオを考えてみましょう。このメソッドは、その型パラメータ パックに含まれるテンプレート パラメータでのみ呼び出すことができます。
この例では:
<code class="cpp">template <typename ... Types> class Base { public: template <typename T> typename std::enable_if<Contains<T, Types ...>::value>::type foo() { std::cout << "Base::foo()\n"; } };
重複しない型セットを使用して Base から 2 回継承するクラス Derived を派生できます:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> {};</code>
Derived().foo
コンパイラがあいまいさを解決できない理由
クラスのマージ ルール-member lookup は、派生クラス (この場合は Derived) の宣言セットが空の場合、メンバー (この場合は foo) のルックアップ セットがすべての直接基本クラスからマージされることを示します。ただし、基底クラスには foo の異なる宣言セットがあるため、マージは曖昧です。
回避策
曖昧さを解決するには、Derived の宣言セットを作成します。基底に foo メソッドの using 宣言を追加することで空ではなくなります:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> { using Base<int, char>::foo; using Base<double, void>::foo; };</code>
Using 宣言により、基底クラスから派生クラスにメンバーが取り込まれ、foo の 2 つのオーバーロードを効果的に Derived に提供します。コンパイラは、適切なオーバーロードを明確に呼び出すことができます。
代替ソリューション
以上が多態性メソッドを呼び出すときに型が重複する多重継承のあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。