Reutilisation de templates dans une méthode de class

Résolu
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012 - 15 févr. 2012 à 23:38
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 16 févr. 2012 à 18:05
Bonsoir,

voilà mon problème :
je tente de faire une class, contenant un std::list, mais cette classe elle même est en template.

Pour certaines raisons, j'ai besoin d'itérer ma liste dans une des méthodes, mais je ne parviens pas à faire accepter par g++ le template de l'itérateur :

template <typename T>
void maclass<T>::ma_methode(void)
{
std::list<T>::iterator lbegin(maliste.begin()), lend(maliste.end());
....
}

me renvoi automatiquement erro: expected ';' before 'lbegin'.
Sachant que si je remplace list<T> par liste par exemple, ca accepte de compiler.

d'où ma question : comment fait-on pour réutiliser un template pour en décrire un autre ?

Par avance, merci.


  Qui ne tente rien...
  Ne risque pas d'avoir grand chose !!!

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 févr. 2012 à 18:05
Bonjour.

En fait, le type std::list<T>::iterator peut correspondre soit:
- À un type
- À un attribut static

Le compilateur ne peux pas le savoir à l'avance. Il va considérer qu'il y a ambiguïté, et fera comme si iterator était un attribut statique.
Or c'est ici un type. Il faut alors lui dire: "hey, c'est un type pas un attribut".
Le mot clé pour réaliser ceci est "typename".

Donc plusieurs solutions:
typename std::list<T>::iterator lbegin(maliste.begin()), lend(maliste.end()); 

ou
typedef typename std::list<T>::iterator iterator;
iterator lbegin(maliste.begin()), lend(maliste.end()); 


A noter que std::list est un type construit, et que le compilateur peut "voir" ce qui est statique ou non. Le mot clé typename n'est à utiliser que pour spécifier des éléments d'un type "incomplet".

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
Rejoignez-nous