次の方法で共有


コンパイラ エラー C2385

'member' へのアクセスがあいまいです

メンバーは複数の基本型から継承され、そのメンバーへの非修飾アクセスがあいまいになります。 このエラーを解決するには、次の方法があります。

  • メンバーへのアクセスを明示的に修飾します。
  • メンバーにアクセスする前に、メンバーを含む基底クラスにオブジェクトをキャストします。
  • 基底クラスのあいまいなメンバーの名前を変更します。
  • メンバーをスコープに取り込みます。

次の例では C2385 が生成されます。

// C2385.cpp
struct A
{
    void func1(int i) {}
    void func2() {}
};

struct B
{
    void func1(char c) {}
    void func2() {}
};

struct C : A, B
{
    // Uncomment the following lines to resolve the first 2 errors
    // The error below for the call to c.func2() will remain
    // using A::func1;
    // using B::func1;
};

int main()
{
    C c;

    c.func1(123); // C2385
    c.func1('a'); // C2385
    c.func2(); // C2385

    c.A::func2(); // OK because explicitly qualified
    c.B::func2(); // OK because explicitly qualified
    static_cast<A>(c).func2(); // OK because of the cast
    static_cast<B>(c).func2(); // OK because of the cast
}

あいまいな呼び出しを func1 解決するには、両方のオーバーロードをスコープに取り込みます。 ただし、これは引数をfunc2受け取らないのB::func2A::func2で機能しないので、それらを呼び出すことはパラメーターによって区別できません。 この問題は、次の方法で解決できます。

  • スコープに使用するものを紹介する
  • 基本型で呼び出しを明示的に修飾する
  • 関数を呼び出す前にオブジェクトをキャストします。