Compartilhar via


Erro do compilador C2385

acesso ambíguo de 'membro'

Um membro é herdado de mais de um tipo base, tornando o acesso não qualificado a esse membro ambíguo. Para resolver esse erro:

  • Qualifique explicitamente o acesso ao membro.
  • Converta o objeto na classe base que contém o membro antes de acessá-lo.
  • Renomeie o membro ambíguo na classe base.
  • Traga o membro para o escopo.

Exemplo

O exemplo a seguir gera 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
}

Você pode resolver as chamadas ambíguas para func1 trazendo ambas as sobrecargas para o escopo. No entanto, isso não funciona para func2 porque A::func2 e B::func2 não aceita argumentos, portanto, chamá-los não pode ser diferenciado por seus parâmetros. Você pode resolver o problema:

  • Introduza o que você deseja usar no escopo
  • Qualifique explicitamente a chamada com o tipo base
  • Converta o objeto antes de chamar a função.