Compilerfehler C2385

Mehrdeutiger Zugriff von „member“

Bemerkungen

Ein Element wird von mehr als einem Basistyp geerbt, wodurch nicht qualifizierter Zugriff auf dieses Element mehrdeutig wird. So beheben Sie diesen Fehler:

  • Zugriff auf das Mitglied explizit qualifizieren.
  • Wandeln Sie das Objekt in die Basisklasse um, die das Element enthält, bevor Sie auf das Element zugreifen.
  • Benennen Sie das mehrdeutige Element in der Basisklasse um.
  • Bringen Sie das Element in den Bereich.

Beispiel

Im folgenden Beispiel wird C2385 generiert:

// 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
}

Sie können die mehrdeutigen Aufrufe func1 auflösen, indem Sie beide Überladungen in den Bereich bringen. Dies funktioniert func2 jedoch nicht, da A::func2 argumente B::func2 nicht verwendet werden, sodass das Aufrufen von Argumenten nicht von ihren Parametern unterschieden werden kann. Sie können das Problem beheben, indem Sie:

  • Einführung in den Bereich, den Sie verwenden möchten
  • Explizites Qualifizieren des Anrufs mit dem Basistyp
  • Wandeln Sie das Objekt vor dem Aufrufen der Funktion um.