Reutilisation de templates dans une méthode de class [Résolu]

Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
- - Dernière réponse : cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
10 juin 2019
- 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 !!!
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
10 juin 2019
85
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu