0 votes

Problèmes avec const set&. Bug du compilateur/STL ou utilisation non portable ?

Y a-t-il des avocats linguistes dans la maison ?

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 plateformes (Sun Workshop), cela ne compile pas. Il signale que la fonction find a retourné 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 se compile :

include <set>

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

9voto

Brian Neal Points 13668

Il devrait compiler. L'ensemble comprend 2 fonctions find() et 2 fonctions end() (versions const et non-const). On dirait que la STL de Sun est cassée d'une manière ou d'une autre. Puisque vous passez dans une référence constante, le compilateur devrait être capable de sélectionner les fonctions find() et end() correctes.

3voto

David Thornley Points 39051

Cela fait quelques années que je n'ai pas utilisé un compilateur C++ de Sun, mais à l'époque, il disposait de deux versions de STL. L'une était une version héritée, qui était loin d'être complète ou correcte, mais qui était conservée pour compiler les anciens programmes, et l'autre était stlport. Vérifiez que vous utilisez la bonne version de la STL.

2voto

zweiterlinde Points 5984

Je ne peux pas reproduire ce comportement exact sur ma plateforme, mais j'ai rencontré des problèmes similaires dans le passé avec des cartes STL. J'ai découvert que j'avais besoin d'assigner explicitement le résultat de la fonction find() à une variable déclarée, et ensuite comparer cette variable au résultat de end() . Cela peut valoir la peine d'essayer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X