2011-05-16 12 views
9

No puedo creer que gcc no acepte el siguiente código ... Dígame si realmente no es posible acceder a una clase interna desde una plantilla base o me falta algo?Problema de acceso de clase interna de herencia de plantilla

template <class T> class BaseClass 
{ 
public: 
    struct MyStruct 
    { 
     T *data; 
    }; 
}; 

template <class T> class ChildClass : public BaseClass <T> 
{ 
    public: 

    void problem() 
    { 
     MyStruct ms1; //error: 'MyStruct' was not declared in this scope 
     ::MyStruct ms2; //error: '::MyStruct' has not been declared 
     BaseClass<T>::MyStruct ms3; //error: expected `;' before 'ms3' 
    } 
}; 
+0

He editado la pregunta para que sea más obvio de qué se trata el problema. Inicialmente sonaba como si estuvieras heredando de una clase interna, y las plantillas no se mencionaron en ningún lugar (excepto el código) en la pregunta, mientras que son el problema real en cuestión. –

Respuesta

14

El problema es que MyStruct es un nombre dependiente, por lo que tiene que decirle al compilador de aplazar la búsqueda de nombres hasta que la plantilla se crea una instancia al clasificarse con el nombre de la clase base:

typename BaseClass<T>::MyStruct ms1; 

Para obtener más información, leí la entrada de preguntas frecuentes de Parashift C++, "Why am I getting errors when my template-derived-class uses a nested type it inherits from its template-base-class?"

+0

Gracias! No puedo creer que la raíz de mis problemas sea la palabra clave typename nuevamente ... – Ryan

Cuestiones relacionadas