gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com