'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
のあいまいな呼び出しを解決できます。 ただし、A::func2
とB::func2
は引数を受け取らないため、func2
では機能しないので、それらを呼び出すことはパラメーターによって区別できません。 この問題は、次の方法で解決できます。
- スコープに使用するものを紹介する
- 基本型で呼び出しを明示的に修飾する
- 関数を呼び出す前にオブジェクトをキャストします。