2009-05-09 16 views
11

Sto cercando di compilare il seguente codice su Linux usando GCC 4.2:tipo/valore non corrispondente a template C++ dichiarazione di classe

#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_; 

}; 

Quando compilo questa classe ricevo il seguente messaggio da 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 

Ho rimosso nomi di file e numeri di riga, ma si riferiscono tutti alla linea che dichiara la mappa.

Quando sostituisco la coppia in queste espressioni con un tipo int o un po 'di cemento, compila bene. Qualcuno può spiegarmi che cosa sto sbagliando?

risposta

21

è necessario scrivere typename prima std::list<...>::iterator, perché iterator è un tipo nidificato e si sta scrivendo un modello.

Modifica: senza typename, GCC presuppone (come richiesto dallo standard) che iterator sia in realtà una variabile statica in list, anziché un tipo. Da qui l'errore "tipo di parametro non corrispondente".

3

Il codice richiede una parola chiave "typename".

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