如果存在具有不同参数的继承成员,为什么对 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?
};
代码如下。我的 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.
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?
};