Поделиться через


Ошибка компилятора C2385

неоднозначный доступ к "члену"

Замечания

Элемент наследуется от нескольких базовых типов, что делает неспровоцированное доступ к такому члену неоднозначным. Устранение ошибки

  • Явным образом квалифицировать доступ к члену.
  • Приведение объекта к базовому классу, содержащего элемент перед доступом к элементу.
  • Переименуйте неоднозначный член в базовом классе.
  • Доведите элемент в область действия.

Пример

В следующем примере создается 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 , приведя обе перегрузки в область. Однако это не работает func2 , так как A::func2 и B::func2 не принимает аргументы, поэтому их вызов не может быть дифференцирован их параметрами. Вы можете устранить проблему, выполнив следующие действия.

  • Знакомство с тем, который вы хотите использовать в области
  • Явно квалифицировать вызов с базовым типом
  • Приведение объекта перед вызовом функции.