2009-11-26 6 views
1

J'ai un problème très stupide avec le code ci-dessous. L'objectif est d'incrémenter plusieurs compteurs à la fois, et d'avoir leur valeur imprimée après avoir été traitée par un foncteur fourni.Comment puis-je obtenir un itérateur sur un vecteur d'objets modélisés?

Cependant g ++ se plaint:

test.hpp:32: error: expected `;' before 'it' "

J'ai essayé d'ajouter un peu typedef, mais le message d'erreur reste. Voici le code (version simplifiée d'un plus grand tas de code)

#include <vector> 
#include <iostream> 

template <class F> 
class Counter 
{ 
    public: 
    Counter(); 
    void increment(int amount); 
    private: 
    F calc; 
    int current_amount; 
}; 

template <class F> 
void Counter<F>::increment(int amount) 
{ 
    current_amount += amount; 
    std::cout << F(amount) << "\n"; 
} 

template <class F> 
class CounterBattery 
{ 
    public: 
     CounterBattery(); 
     void incrementAll(int amount); 
    private: 
     std::vector<Counter<F> > counters; 
}; 

template <class F> 
void CounterBattery<F>::incrementAll(int amount) 
{ 
    for (std::vector<Counter<F> >::iterator it = counters.begin() ; it != counters.end() ; it++) // fails to compile here 
    it->increment(amount); 
} 

Je ne comprends pas ce que je fais mal avec les modèles ici.

Merci pour toute aide que vous pourriez fournir

+0

Apprenez à utiliser le balisage pour Stackoverflow. Code de retrait de 4 espaces et couleurs automatiques pour vous. –

Répondre

1

je pense qu'il pourrait être lié avec std::vector<Counter<F> >::iterator étant un nom à charge, essayez de le remplacer par
typename std::vector<Counter<F> >::iterator.
De cette façon, le compilateur ignorera jusqu'à ce qu'il est instancié en fait le modèle avec une donnée F.

Voici un lien pour dependent names in C++

EDIT: suivant jalf répondre à cette link explique que si nous précisons typename la Le compilateur ne confondra pas le nom avec une variable et c'est la raison pour laquelle il est remis à plus tard, sans la désambiguïsation, il pensera que c'est un problème et tentera de le résoudre à ce moment-là.

+0

Solution correcte, mais votre explication est fausse. 'typename' n'affecte pas * quand * le template est instancié. Il indique simplement au compilateur de supposer que 'iterator' est un type plutôt qu'une valeur. – jalf

+0

Je n'ai pas dit que cela affectait l'instanciation du modèle, j'ai dit qu'il reporterait cette identification de type jusqu'à ce que le modèle soit instancié, ce qui est techniquement correct selon moi. –

+0

Merci pour la réponse, cela a fonctionné parfaitement. Et merci pour les liens aussi! – tiredOfCpp

5

insert typename ici:

for (typename std::vector<Counter<F> >::iterator it = counters.begin() ; 
Questions connexes