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

标签 c++ static-methods ambiguous-call private-inheritance

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

相关文章:

c++ - 如何为 GSL(GNU 科学图书馆)改编 C++ 风格的随机数引擎?

具有静态方法和对自身的引用的 Python 类

python - 静态方法和继承设计

javascript - 暧昧的称呼? JavaScript 函数和对象

python - 使用 SWIG 为 python 包装 C++ 代码。无法使用 cout 命令

c++ - 在头文件中使用命名空间时的多重定义

c++ - 如何找出具有文件路径的字符串中是否有任何非ASCII字符

java - 从不相关的类调用静态同步方法是否安全?

c++ - 这个函数调用在 C++ 中是如何模糊的?