我想知道为什么对静态函数的调用是模棱两可的,即使这两个函数之一显然是不可能的,因为它是私有(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中的重载行为)的方式,以某种方式遵守“不要重复”的规则你自己。
最佳答案
是的,它在C++标准的第3.4节[basic.lookup]中指定
名称查找与可访问性无关:它同时找到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/