Проблемы с постоянным набором &. Ошибка компилятора / STL или непереносимое использование? - PullRequest
0 голосов
/ 13 февраля 2009

Есть ли в доме языковые юристы?

Должен ли следующий код компилироваться?

include <set>

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

На одной из платформ (Sun Workshop) это не компилируется. Он сообщает, что функция find возвратила итератор и функцию end, которая возвратила const_iterator, и что у нее нет действительного оператора сравнения между этими типами.

компилируется следующее:

include <set>

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

Ответы [ 3 ]

9 голосов
/ 13 февраля 2009

должно скомпилироваться. Набор включает в себя 2 функции find () и 2 функции end () (постоянная и неконстантная версии). Похоже, что Sun STL как-то сломан. Поскольку вы передаете константную ссылку, компилятор должен иметь возможность выбрать правильные функции find () и end ().

3 голосов
/ 13 февраля 2009

Прошло несколько лет с тех пор, как я использовал компилятор Sun C ++, но в то время у него было две версии STL. Одна из них была устаревшей версией, которая была далеко не полной или правильной, но которую они хранили для компиляции старых программ, а другая была stlport. Убедитесь, что вы используете правильную версию STL.

2 голосов
/ 13 февраля 2009

Я не могу продублировать это точное поведение на моей платформе, но в прошлом я сталкивался с подобными проблемами с картами STL. Я обнаружил, что мне нужно явно присвоить результат find() объявленной переменной, а затем сравнить эту переменную с результатом end(). Это может стоить того.

...