如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?

Why is a call to a C++ struct's function ambiguous if there are inherited members with different parameters?

代码如下。我的 class D 中只有一个函数 f() 和一个函数 f(int),那么如果两个函数具有不同的参数,为什么调用不明确?

struct A {
    void f() {}
};

struct B: virtual A {
    void f(int i) {}
};

struct C: virtual A {
    void f() {}
};

struct D: B, C {

};

int main()
{
    D d;
    d.f(5); //ambiguous
}

这里的问题是成员名称查找,它发生在评估哪些函数可行和应用重载决策之前。当名称查找从两个或多个不相关的基础 class 中找到名称时,这被认为是不明确的查找,立即无效。

有关详细信息,请阅读 unqualified name lookup in class member definitions。 (这实际上不是您在此处拥有的上下文,但相同的规则适用于成员访问表达式。)

您可以通过使用限定 ID 指定要开始查找的基 class 来解决此问题:

d.B::f(5);

或者,您可以直接在 D:

中使这两个函数显式可见
struct D: B, C {
    using B::f;
    using C::f;
};

调用不明确,因为结构 D 的基 A 和 C 都有一个名为 void f() 的函数,即使 A 的 f() 是隐藏的。为了消除歧义,您应该在 D.

中声明 f()
struct A {
    void f() {}
};

struct B: virtual A {
    void f(int i) {}   // <  hides A::f(), even if signature is different,
};

struct C: virtual A {
    void f() {}        // <  hides A::f()
};

struct D: B, C {
                       // f(...) functions in both base... which one hides the other?
};