为什么私有继承不能解决静态函数的歧义?(在MSVC中测试)

N0v*_*ber 6 c++ static-methods ambiguous-call private-inheritance

我想知道为什么对静态函数的调用是模糊的,即使其中一个显然不可能调用,因为它是私有的.我希望我可以使用私有/受保护的继承来帮助编译器解决歧义.

它是特定于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
}
Run Code Online (Sandbox Code Playgroud)

背景是我试图通过继承它来重用许多派生类(C,D,E,F,G)中的重载行为(A中的那个),以某种方式遵守不重复的规则你自己.

qua*_*dev 7

是的,它在C++标准中指定,第3.4节[basic.lookup]

访问规则(第11条)仅在名称查找和功能重载解析(如果适用)成功后才被考虑

名称查找不关心辅助功能:它找到既A::numB::num,所以编译器的不确定性.

您可以显式调用A::num:

C::A::num();
Run Code Online (Sandbox Code Playgroud)

如果您明确尝试调用B::num,那么您的编译器确实会发出访问错误:

C::B::num(); // Error
Run Code Online (Sandbox Code Playgroud)

您还可以将基本名称显式地放在派生类中的范围内,这将修复歧义:

struct C : public A, private B
{
    using A::num;    
};
Run Code Online (Sandbox Code Playgroud)