На самом деле стандарт C ++ (т. е. C ++ 0x draft ) говорит (tnx to @Xeo & amp; @Ben Voigt для указания этого на меня):
23.2 .4 Ассоциативные контейнеры 5 Для set и multiset тип значения совпадает с типом ключа. Для карты и мультимапа он равен паре. Ключи в ассоциативном контейнере неизменяемы. 6 итератор ассоциативного контейнера относится к категории двунаправленного итератора. Для ассоциативных контейнеров, где тип значения совпадает с типом ключа, оба итератора и const_iterator являются постоянными итераторами. Не указано, является ли итератор и const_iterator одним и тем же типом.
blockquote>Итак, реализация Dinkumware VC ++ 2008 ошибочна.
Старый ответ:
Вы получили эту ошибку, потому что в некоторых реализациях std lib
set::iterator
совпадает сset::const_iterator
.Например, libstdc ++ (поставляется с g ++) имеет его (см. здесь для всего исходного кода):
typedef typename _Rep_type::const_iterator iterator; typedef typename _Rep_type::const_iterator const_iterator;
И в SGI docs указывает:
iterator Container Iterator used to iterate through a set. const_iterator Container Const iterator used to iterate through a set. (Iterator and const_iterator are the same type.)
С другой стороны, VC ++ 2008 Express компилирует ваш код, не жалуясь, что вы вызываете методы non const на
set::iterator
s.