Partager via


Erreur du compilateur C2385

accès ambigu de 'member'

Un membre est hérité de plusieurs types de base, ce qui rend l’accès non qualifié à ce membre ambigu. Pour corriger cette erreur :

  • Qualifiez explicitement l’accès au membre.
  • Cassez l’objet dans la classe de base contenant le membre avant d’accéder au membre.
  • Renommez le membre ambigu dans la classe de base.
  • Placer le membre dans l’étendue.

Exemple

L’exemple suivant génère l’erreur 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
}

Vous pouvez résoudre les appels ambigus en func1 apportant les deux surcharges dans l’étendue. Toutefois, cela ne fonctionne pas car func2 A::func2 et B::func2 ne prend pas d’arguments, de sorte qu’ils ne peuvent pas être différenciés par leurs paramètres. Vous pouvez résoudre le problème en :

  • Présentation de celle que vous souhaitez utiliser dans l’étendue
  • Qualifier explicitement l’appel avec le type de base
  • Castez l’objet avant d’appeler la fonction.