一个完全限定的静态成员变量中的歧义问题

11
在这段示例代码中,有两个句子显示相同的静态变量。第一个句子没有歧义,但第二个句子却有歧义,为什么?
#include <iostream>

using namespace std;

struct A { static const char a = 'a'; };
struct B : public A { };
struct C : public A { };
struct G : public B, public C { };

int main()
{
    G v;

    cout << G::B::A::a << endl;
    cout << v.B::A::a << endl;
}

GCC错误(根据一些评论,clang中没有歧义):

main.cpp:15:18: error: 'A' is an ambiguous base of 'G'
  cout << v.B::A::a << endl;

在 coliru 上的代码


1
我知道一个月前左右我看到过类似的东西。我认为它在 v 情况下不知道该使用哪个父级。正在尝试找到它。 - NathanOliver
8
@Peregring-lk,http://coliru.stacked-crooked.com/a/9d43d2604247b3c0 更容易理解和阅读,比你的示例简单20倍。你的示例中大部分是无关的干扰信息,只会让事情更加难以理解。 - Jonathan Wakely
2
EDG也接受它。如果您找不到现有的错误,请报告GCC错误,并提供最小示例(而非冗长原始代码)。谢谢。 - Jonathan Wakely
2
@JonathanWakely,我认为你澄清的例子值得回答。 - SergeyA
1
这不是答案,只是原始问题中应该包含的MCVE。 - Jonathan Wakely
显示剩余3条评论
1个回答

5

显然这是GCC的一个bug,正如GCC维护者建议您进行报告。然而,在修复之前,您可以使用类似这样的丑陋解决方法:

std::cout << static_cast<B &>(v).A::a;

优点在于,这将有助于消除一个(复杂)情况下基类中存在相同名称变量的歧义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接