2012-08-17 39 views
10

tengo un caso extraño con Visual Studio 2003. Por razones legítimas tanto, tengo la siguiente jerarquía:nombre resolución cuando el padre y la clase interna tienen el mismo nombre

class A {}; 

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

class C : public B::A {}; 

Es decir, que tienen un interior clase con el mismo nombre que un padre de la clase externa. Cuando C intenta heredar desde B::A, Visual Studio cree que estoy apuntando a la clase primaria A, no a la clase anidada dentro de B. GCC parece resolver la versión de clase interna como esperaba

¿Es esto un error de Visual Studio 2003, o lo estoy haciendo mal? ¿Hay una solución alternativa (que no sea la actualización de Visual Studio)?

+0

Visual C++ 2003 se lanzó hace nueve años. Sería aconsejable actualizar por muchas razones. –

+1

@JamesMcNellis Si estuviera a cargo de estas cosas, nos hubiéramos actualizado hace mucho tiempo, pero lamentablemente no soy –

Respuesta

2

Sí, esto se parece al error VS2003. La solución es simple: use typedef, funciona de esta manera:

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

Esto parece un error en Visual C++ 2003. Utilizando Visual C++ 2012, B::A nombra correctamente la clase anidada A, no la clase base A.

+0

En cuanto a una solución alternativa, no sé: el diseño es bastante cuestionable. Cambiaría el nombre de la clase anidada. Si tuviera instalado Visual C++ 2003, trataría de ver qué pasa, pero no he usado Visual C++ 2003 en unos años. –

+0

Fui estúpido y no probé mi ejemplo simplificado; resulta que estaba mal. El actualizado reproduce el problema –

+2

@MichaelMrozek VS 2012 resolver a la clase interna. – ForEveR

0

Parece un error VS,
No lo sabía Gracias por publicarlo.
Creo que la solución será una plantilla SafeInherit No sé cuál será un nombre mejor.

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

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
} 
Cuestiones relacionadas