我想知道为什么对静态函数的调用是模棱两可的,即使这两个函数之一显然是不可能的,因为它是私有(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::numB::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/

10-10 20:12