我想知道为什么对静态函数的调用是模棱两可的,即使两者之一显然不可能调用,因为它是私有(private)的。 我希望我可以使用 private/protected 继承来帮助编译器解决歧义。
它是特定于 MSVC 还是以某种方式在标准中指定?
struct A
{
static int num() { return 0; }
};
struct B
{
static int num() { return 1; }
};
struct C : public A, private B
{};
int main()
{
C::num(); // Ambiguous access of num
}
背景是我正在尝试一种通过继承在许多派生类(C、D、E、F、G)中重用重载行为(A 中的行为)的方法,以某种方式遵守 Don 的规则不要重复自己。
最佳答案
是的,它在 C++ 标准中指定,第 §3.4 [basic.lookup] 部分
The access rules (Clause 11) are considered only once name lookup and function overload resolution (if applicable) have succeeded
名称查找不关心可访问性:它同时查找 A::num
和 B::num
,因此编译器存在歧义。
您可以显式调用 A::num
:
C::A::num();
如果您明确尝试调用 B::num
,那么您的编译器确实会发出访问错误:
C::B::num(); // Error
您还可以显式地将基名称引入派生类的范围内,这将解决歧义:
struct C : public A, private B
{
using A::num;
};
关于c++ - 为什么私有(private)继承不能解决静态函数的歧义? (在 MSVC 中测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27679567/