2012-10-24 2 views
0

Je viens de mettre à jour une bibliothèque tierce appelée RogueWave que j'utilise pour les fonctions de base de données.Initialisation d'un itérateur en C++

Mais, je reçois une erreur de compilation vraiment stupide, et je ne suis pas tout à fait sûr de ce qu'il se plaint:

typedef std::set<EVBusCalOverride> OverrideSet; 
OverrideSet overrides; 

OverrideSet::iterator itor = this->overrides.begin(); 
while(itor != this->overrides.end()) 

Je reçois une erreur sur la ligne d'initialisation de iterator dire

An object or reference of type "std::set<EVBusCalOverride,std::less<EVBusCalOverride>,std::allocator<EVBusCalOverride> >::iterator" 
cannot be initialized with an rvalue of type "std::_Tree<std::_Tset_traits<EVBusCalOverride,std::less<EVBusCalOverride>,std::allocator<EVBusCalOverride>,0> >::const_iterator". 

Et EVBusCalOverride est juste une classe

class EVBusCalOverride 
{ 

    private: 
    RWDate overrideDate; 
    bool businessDay; 
}; 

RWDate est une variable DateType que b s'allonge dans les bibliothèques RogueWave.

Je ne sais pas comment cela affecte l'initialisation de l'itérateur. Quelqu'un peut-il me diriger dans la bonne direction de ce qui pourrait causer cela?

Répondre

5

roguewave est une bibliothèque très ancienne.

La plupart des collections ont deux types d'itérateur, iterator qui vous permet de changer les membres et const_iterator qui ne le fait pas.

std::set est une exception à cette règle dans le sens où vous ne pouvez pas modifier les membres de sorte que tous les itérateurs soient const. Cependant, ils prennent toujours en charge iterator et const_iterator, souvent l'un étant un alias de l'autre, mais roguewave ne le fait évidemment pas.

Modifier iterator dans votre code à const_iterator va probablement résoudre, mais je vous suggère de changer votre version de STL si possible.

+0

http://kera.name/articles/2010/08/it-is-not-called-the-stl-mmkay/ – Griwes

+0

article lien ci-dessus a pris une éternité à charger et puis est juste une critique de moi disant STL pour signifier le bibliothèque standard, bien que std :: set fasse définitivement partie de STL. – CashCow

1

Il semble que les remplacements sont const. Ce code fait-il partie d'une méthode const? Dans ce cas, vous devez initialiser le iterator comme ceci:

OverrideSet::const_iterator itor = this->overrides.begin(); 
1

Le message d'erreur dit:

... :: const_iterator

Je suppose que cela est appelé dans un const méthode.

+0

Évidemment pas une bonne réponse, et à mon avis, pas une réponse du tout. 'const_' est là parce que' begin() 'renvoie' const_iterator' pour 'std :: set' –

+0

la réponse est correcte si elle n'est pas très bien exprimée. – CashCow