2010-03-19 4 views
1

Je suis occupé à implémenter un Graph ADT en C++. J'ai des modèles pour les bords et les sommets. À chaque sommet, j'ai un vecteur contenant des pointeurs vers les bords qui lui sont incidents. Maintenant, j'essaie d'obtenir un itérateur sur ces bords. Ce sont les lignes de code:Comment puis-je obtenir un itérateur sur un vecteur d'objets à partir d'un modèle?

vector<Edge<edgeDecor, vertexDecor, dir>*> edges = this->incidentEdges(); 
vector<Edge<edgeDecor, vertexDecor, dir>*>::const_iterator i; 
for (i = edges.begin(); i != edges.end(); ++i) { 

Cependant, le compilateur n'acceptera pas la ligne du milieu. Je suis assez nouveau en C++. Est-ce que je manque quelque chose? Pourquoi ne puis-je pas déclarer un itérateur sur des objets du modèle Edge? Le compilateur ne donne aucun retour utile.

Une grande partie grâce Niel

+6

Lorsque vous obtenez des erreurs de compilation, il est utile de nous montrer l'erreur que vous obtenez. :) Aussi, la fonction complète si possible, afin que nous puissions voir comment chaque variable devient ce qu'elle est. – GManNickG

Répondre

3

Si cet extrait provient d'un modèle, vous avez probablement courir dans le problème des noms dépendants - utiliser typename:

typename vector<Edge<edgeDecor, vertexDecor, dir>*>::const_iterator i; 

typename indique au compilateur que vous faites référence un type. Sans cela, les noms dépendants sont supposés ne pas être des types ou des modèles.

Pour plus de détails, jetez un œil, par ex. Comeaus template FAQ.

+0

Je doute que le mot-clé 'typename' soit nécessaire ici. Edge est utilisé comme une classe (il est entièrement spécialisé), pas comme un gabarit ici comme je peux le voir. –

+0

Je suppose qu'au moins l'un des arguments de modèle à 'Edge <>' est un argument de modèle pour le modèle environnant - clarifié cela. –

+0

Merci gf, ça semble le résoudre, ça se compile bien maintenant. Je n'ai pas encore testé le code mais je suis assez confiant que c'est le dernier. Pour ceux qui sont intéressés, j'ai collé les deux fichiers d'en-tête, ainsi que le fichier cpp en question sur http://pastebin.com/dR3S78Pv (non modifié). –

Questions connexes