2009-02-13 12 views
0

Y a-t-il des avocats en langues dans la maison?Problèmes avec const set &. Bogue du compilateur/STL ou utilisation non portable?

Le code suivant doit-il être compilé?

include <set> 

bool fn(const std::set<int>& rSet) 
{ 
    if (rSet.find(42) != rSet.end()) return true; 
    return false; 
} 

Sur l'une des plates-formes (Sun Workshop), ceci n'est pas compilé. Il signale que la fonction find a renvoyé un itérateur et la fonction end qui a retourné un const_iterator et qu'il n'a pas d'opérateur de comparaison valide entre ces types.

Ce qui suit ne compile:

include <set> 

bool fn(std::set<int>& rSet) 
{ 
    if (rSet.find(42) != rSet.end()) return true; 
    return false; 
} 
+0

Pas une réponse à votre question. Mais il serait mieux écrit comme: return rSet.find (42)! = RSet.end(); –

Répondre

9

Il devrait compiler. L'ensemble comprend 2 fonctions find() et 2 fonctions end() (const et non-const). Il semble que le STL de Sun soit brisé d'une manière ou d'une autre. Puisque vous passez une référence const, le compilateur devrait être capable de sélectionner les bonnes fonctions find() et end().

2

Je ne peux pas reproduire ce comportement exact sur ma plate-forme, mais je l'ai rencontré des problèmes similaires dans le passé avec des cartes STL. J'ai trouvé que j'avais besoin d'assigner explicitement le résultat de find() à une variable déclarée, puis de comparer cette variable au résultat de end(). Cela peut valoir la peine d'être photographié.

3

Cela fait quelques années que j'ai utilisé un compilateur Sun C++, mais à l'époque, il avait deux versions STL. L'un était une version héritée, qui n'était pas presque complète ou correcte, mais qu'ils conservaient pour compiler des programmes plus anciens, et un était stlport. Vérifiez que vous utilisez une version STL correcte.