2016-05-25 10 views
11

In diesem Beispielcode gibt es zwei Sätze, die die gleiche statische Variable zeigen. Der erste gibt keine Zweideutigkeit, aber der zweite, warum?Mehrdeutigkeit in einer vollständig qualifizierten statischen Membervariablen

#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 Fehler (nach einigen Kommentaren, gibt es keine Zweideutigkeit in Klirren):

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

Code on coliru

+1

Ich weiß, dass ich so etwas vor einem Monat gesehen habe. Ich glaube, dass es nicht weiß, welches Elternteil im "v" -Fall zu verwenden ist. Versuche es zu finden. – NathanOliver

+0

@barakmanos Genau, ich erforsche den Fall, wenn ich keine virtuelle Vererbung brauche. –

+1

Dies kompiliert erfolgreich mit clang. – interjay

Antwort

5

Dies ist eindeutig ein Fehler in GCC, als GCC maintainer empfehlen Sie darüber berichten. Doch bis es ist festgelegt, können Sie eine böse Abhilfe wie folgt verwenden:

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

Der Vorteil ist, diese Mehrdeutigkeiten helfen, wenn in einem (komplexen) Szenario, dass es Variablen mit dem gleichen Namen in einer der Basisklassen .

Verwandte Themen