2009-05-09 7 views
11

Je suis en train de compiler le code suivant sur Linux en utilisant gcc 4.2:type/décalage de valeur dans le modèle C++ déclaration de 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_; 

}; 

Quand je compile cette classe je reçois le message suivant 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 

J'ai supprimé les noms de fichier et les numéros de ligne, mais ils se réfèrent tous à la ligne déclarant la carte.

Lorsque je remplace la paire dans ces expressions avec un int ou un type concret, il compile bien. Quelqu'un peut-il m'expliquer ce que je fais de mal?

Répondre

21

Vous devez écrire typename avant std::list<...>::iterator, car iterator est un type imbriqué et vous écrivez un modèle.

Edit: sans typename, GCC assume (comme la norme exige) que iterator est en fait une variable statique dans list, plutôt qu'un type. D'où l'erreur "incompatibilité de type de paramètre".

3

Votre code nécessite un mot-clé "typename".

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