2009-10-15 9 views
5

Encore une fois, je me retrouve aux prises avec la syntaxe C++. J'essaie d'itérer sur une liste d'objets génériques. C'est que j'ai des objets d'une classe Event<Q>, entassés dans un std::list<Event<Q> >.C++: itérer sur une liste d'un type générique

Je suis en train d'obtenir un itérateur sur la liste et de la pensée intuitive que

std::list<Event<Q> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

devrait résoudre le problème. Cependant, je continue d'obtenir ces erreurs:

..\calendar.h:48: error: expected `;' before "it" 
..\calendar.h:49: error: `it' was not declared in this scope 

Y at-il une raison pour que ce soit si difficile?

+1

Pouvez-vous être plus précis sur les erreurs que vous obtenez? –

+0

... et un peu plus de code, peut-être. Comment les 'événements 'sont-ils instanciés? – peterchen

Répondre

8

Bien sûr, cela devrait fonctionner, mais il semble que vous ayez un ou les deux suivants dans l'action.

  • Vous avez un paramètre de modèle ou un type qui en dépend d'une autre manière (typedef). Mettez un typename avant std::list puis, de sorte que le compilateur sache que ::iterator est un type et peut procéder à l'analyse correctement (il peut s'agir d'un membre de valeur statique). Sachant qu'il s'agit d'un type, le compilateur peut produire de meilleurs diagnostics pour les définitions de modèles, et vous devez indiquer s'il s'agit d'un type utilisant typename.
  • Avoir events une liste const. Utilisez const_iterator puis.

Mise à jour: L'erreur de compilation montré indique sûrement que le premier point est vrai: Q dépend directement ou indirectement d'un paramètre de modèle, et vous devez mettre typename comme ceci:

typename std::list< Event<Q> >::iterator it; 

Le compilateur vous croit que c'est un non-type, et il nécessite donc un opérateur ou un point-virgule derrière ::iterator (comme, une multiplication). Mettez typename pour lui faire savoir qu'il nomme un type à la place.

Mise à jour: Voir le pour des problèmes et des solutions similaires.

+0

Merci beaucoup, cela a résolu.Je l'ai fait: 'typename std :: Liste > :: iterator il s' et magie travaillé – Nubsis

+0

Oops j'ai raté la partie de l'événement <> autour Q xD Heureux cela fonctionne :) –

+0

Votre explication est très lucide et aussi résolu mon problème :) Merci beaucoup, Johannes! –

0

dans votre échantillon, qu'est-ce que S?

list<Event<S> >::iterator it; // what is S 
for (it = events.begin(); it != events.end(); it++) { ... } 

pouvez-vous essayer de mettre un type natif là-bas?

list<Event<int> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

ou simplifier encore plus?

list<int>::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 
0

Avez-vous importé l'espace de noms std? La déclaration de l'itérateur doit-elle avoir été:

std::list<Event<S> >::iterator it; 
Questions connexes