2009-05-09 5 views
11

Estoy tratando de compilar el código siguiente en Linux con gcc 4.2:Tipo/valor de desajuste en la plantilla C++ declaración de la clase

#include <map> 
#include <list> 

template<typename T> 
class A 
{ 
... 

private: 
    std::map<const T, std::list<std::pair<T, long int> >::iterator> lookup_map_; 
    std::list<std::pair<T, long int> > order_list_; 

}; 

Cuando puedo compilar esta clase recibo el siguiente mensaje de gcc:

error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’ 
error: expected a type, got ‘std::list<std::pair<const T, long int>,std::allocator<std::pair<const T, long int> > >::iterator’ 
error: template argument 4 is invalid 

He eliminado los nombres de los archivos y los números de línea, pero todos se refieren a la línea que declara el mapa.

Cuando reemplazo el par en estas expresiones con un int o algún tipo concreto, se compila bien. ¿Puede alguien por favor explicarme qué estoy haciendo mal?

Respuesta

21

tiene que escribir typename antes std::list<...>::iterator, porque iterator es un tipo anidado y se está escribiendo una plantilla.

Editar: sin el typename, GCC supone (como requiere el estándar) que iterator es en realidad una variable estática en list, en lugar de un tipo. De ahí el error "error de tipo de parámetro".

3

Su código necesita una palabra clave "typename".

std::map<const T, typename std::list<std::pair<T, long int> >::iterator> lookup_map_; 
Cuestiones relacionadas