2012-08-17 7 views
10

ich einen seltsamen Fall mit Visual Studio haben 2003 etwas legitimen Gründen, ich habe die folgende Hierarchie:Falsche Namensauflösung, wenn Eltern und innere Klasse haben den gleichen Namen

class A {}; 

class B : public A { 
public: 
    class A {}; 
}; 

class C : public B::A {}; 

Das heißt, habe ich eine innere Klasse mit dem gleichen Namen wie ein Elternteil der äußeren Klasse. Wenn C versucht, von B::A zu erben, denkt Visual Studio, dass ich auf die übergeordnete Klasse A, nicht die geschachtelte Klasse innerhalb B zeige. GCC scheint zu der inneren Klassenversion zu lösen, wie ich es erwartet hatte

Ist das ein Visual Studio 2003 Fehler, oder mache ich es falsch? Gibt es eine Problemumgehung (abgesehen von der Aktualisierung von Visual Studio)?

+0

Visual C++ 2003 wurde vor neun Jahren veröffentlicht. Es wäre ratsam, für viele Gründe zu aktualisieren. –

+1

@JamesMcNellis Wenn ich für diese Dinge verantwortlich wäre, hätten wir vor langer Zeit ein Upgrade durchgeführt, aber leider bin ich nicht –

Antwort

2

Ja, das sieht wie VS2003 Bug aus. Problemumgehung ist einfach - Verwenden Sie Typedef, funktioniert es auf diese Weise:

class A { public: int x; }; 
class B : public A { public: class A { public: int y; }; }; 

typedef B::A BA; 

class C: public BA {}; 

void f() 
{ 
    C cc; 
    cc.y = 0; 
} 
5

Das sieht wie ein Fehler in Visual C++ 2003 aus. Visual C++ 2012, B::A benennt korrekt die geschachtelte Klasse A, nicht die Basisklasse A.

+0

Was eine Problemumgehung angeht, ich weiß nicht: das Design ist eher fragwürdig. Ich würde die verschachtelte Klasse umbenennen. Wenn ich Visual C++ 2003 installiert hätte, würde ich versuchen, zu sehen, was los ist, aber ich habe Visual C++ 2003 in ein paar Jahren nicht verwendet. –

+0

Ich war dumm und habe mein vereinfachtes Beispiel nicht getestet; Es stellt sich heraus, dass es falsch war. Die aktualisierte reproduziert das Problem –

+2

@MichaelMrozek VS 2012 zu der inneren Klasse zu lösen. – ForEveR

0

Es sieht aus wie ein VS-Bug,
Ich wusste es nicht Danke für die Veröffentlichung.
Ich denke, die Abhilfe ist ein SafeInherit Template Ich weiß nicht, was ein besserer Name sein wird.

template <typename T> 
struct SafeInherit{ 
    typedef T Type; 
}; 

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
} 
Verwandte Themen