2012-08-17 2 views
10

J'ai un cas étrange avec Visual Studio 2003. Pour des raisons un peu légitimes, je la hiérarchie suivante:résolution de nom incorrect lors de parent et classe interne ont le même nom

class A {}; 

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

class C : public B::A {}; 

C'est, j'ai un intérieur classe avec le même nom qu'un parent de la classe externe. Lorsque C essaie d'hériter de B::A, Visual Studio pense que je pointe vers la classe parente A, pas la classe imbriquée dans B. GCC semble se résoudre à la version de classe interne comme je m'y attendais

Est-ce un bogue de Visual Studio 2003, ou est-ce que je le fais mal? Y a-t-il une solution de contournement (autre que la mise à niveau de Visual Studio)?

+0

Visual C++ 2003 a été publié il y a neuf ans. Il serait souhaitable de mettre à niveau pour de nombreuses raisons. –

+1

@JamesMcNellis Si j'étais en charge de ces choses nous aurions mis à jour il ya longtemps, mais malheureusement je ne suis pas –

Répondre

2

Oui, cela ressemble à un bogue VS2003. La solution de contournement est simple: utilisez typedef, cela fonctionne de la façon suivante:

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

Cela ressemble à un bogue dans Visual C++ 2003. En utilisant Visual C++ 2012, B::A nomme correctement la classe imbriquée A, pas la classe de base A.

+0

Comme pour une solution de contournement, je ne sais pas: le design est plutôt discutable. Je renommerais la classe imbriquée. Si j'avais Visual C++ 2003 installé, j'essaierais de voir ce qui se passe, mais je n'ai pas utilisé Visual C++ 2003 dans quelques années. –

+0

J'étais stupide et n'ai pas testé mon exemple simplifié; s'avère que c'était faux. Le mis à jour reproduit le problème –

+2

@MichaelMrozek VS 2012 résoudre à la classe interne. – ForEveR

0

Cela ressemble à un bug VS,
Je ne savais pas Merci pour l'affichage.
Je pense que la solution de contournement sera un SafeInherit Template Je ne sais pas quel sera le meilleur nom.

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

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
} 
Questions connexes