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中的那个),以某种方式遵守不重复的规则你自己.
是的,它在C++标准中指定,第3.4节[basic.lookup]
访问规则(第11条)仅在名称查找和功能重载解析(如果适用)成功后才被考虑
名称查找不关心辅助功能:它找到既A::num和B::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)