2010-02-11 12 views
5

El código de abajo da el error:error de compilación al definir STL iterador dentro de clase de plantilla

error: type ‘std::list<T,std::allocator<_Tp1> >’ is not derived from type ‘Foo<T>’
error: expected ‘;’ before ‘iter’

#include <list> 

template <class T> class Foo 
{ 
    public: 
     std::list<T>::iterator iter; 

    private: 
     std::list<T> elements; 
}; 

¿Por qué y si esto fuera a ser correcto?

Respuesta

7

Necesita typename std::list<T>::iterator. Esto se debe a que list depende del parámetro de la plantilla, por lo que el compilador no puede saber exactamente cómo es el nombre iterator (técnicamente, podría saberlo, pero el estándar C++ no funciona de esa manera). La palabra clave typename le dice al compilador que lo que sigue es un nombre de un tipo.

+1

Todavía no entiendo por qué esto es así. Por ejemplo, ¿por qué no necesitamos usar 'typename std :: list elements'? –

+1

@Agnel: Porque entonces no intentaremos acceder a nombres definidos dentro de una clase de plantilla. – UncleBens

3

Se necesita un nombre de tipo

template <class T> class Foo { 
    public: 
     typename std::list<T>::iterator iter; 

    private: 
     std::list<T> elements; 
}; 
Cuestiones relacionadas