编译器错误 C2385

对“member”的访问不明确

成员继承自多个基类型,使对该成员的非限定访问权限不明确。 解决此问题的方法是:

  • 显式限定对成员的访问权限。
  • 在访问成员之前,将对象强制转换为包含该成员的基类。
  • 重命名基类中的不明确成员。
  • 将成员引入范围。

示例

以下示例生成 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::func2B::func2 不带参数,调用它们时无法通过参数区分。 可以通过以下方法解决此问题:

  • 将要使用的项引入范围
  • 使用基类型显式限定调用
  • 在调用函数之前强制转换对象。