2016-05-25 12 views
11

このサンプルコードでは、同じ静的変数を示す2つの文があります。最初のものはあいまいさを与えませんが、2番目のものはなぜですか?完全修飾静的メンバー変数のあいまいさ

#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エラー(いくつかのコメントによると、打ち鳴らすにはあいまいさがありません):

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

Code on coliru

+1

私はこのようなものを1カ月ほど前に見たことがわかります。私はそれが 'v'の場合にどの親を使うべきかを知らないと信じています。それを見つけようとしています。 – NathanOliver

+0

@barakmanosまさに、私は仮想継承を必要としないケースを研究しています。 –

+1

これはclangで正常にコンパイルされます。 – interjay

答えて

5

GCC maintainerは、あなたがそれを報告推奨していますので、これは、明らかにGCCのバグです。しかし、それは固定されるまで、あなたがこのような厄介な回避策を使用することができます。

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

を利点は、これは(複雑な)シナリオであれば基底クラスの1つに同じ名前の変数があることを明確にするのに役立ちますです。

関連する問題