Kompilatorfel C2385

tvetydig åtkomst till "medlem"

Anmärkningar

En medlem ärvs från mer än en bastyp, vilket gör okvalificerad åtkomst till medlemmen tvetydig. Så här löser du det här felet:

  • Kvalificerar uttryckligen åtkomst till medlemmen.
  • Omvandla objektet till basklassen som innehåller medlemmen innan du öppnar medlemmen.
  • Byt namn på den tvetydiga medlemmen i basklassen.
  • Ta med medlemmen i omfånget.

Example

I följande exempel genereras 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
}

Du kan lösa de tvetydiga anropen till genom att func1 föra in båda överlagringarna i omfånget. Detta fungerar dock inte för func2 eftersom A::func2 och B::func2 inte tar argument, så att anropa dem kan inte särskiljas av deras parametrar. Du kan lösa problemet genom att:

  • Introducera den som du vill använda i omfånget
  • Kvalificera anropet uttryckligen med bastypen
  • Kasta objektet innan du anropar funktionen.