编译器错误 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::func2
和 B::func2
不带参数,调用它们时无法通过参数区分。 可以通过以下方法解决此问题:
- 将要使用的项引入范围
- 使用基类型显式限定调用
- 在调用函数之前强制转换对象。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈