2012-03-15 4 views
9

Possible Duplicate:
C++ STL set update is tedious: I can't change an element in placeстанд :: набора итератора автоматически Const

Я добыл эту проблему и изменил имена и так ради простоты.

В основном я создаю экземпляр класса, и я запасти его в станд :: набор, позже я хотел бы иметь ссылку на класс, так что я могу проверить свои ценности и изменять их ...

упрощенный код:

 MyClass tmpClass; 
     std::set<MyClass > setMyClass; 
     setMyClass.insert(tmpClass); 
     std::set<MyClass >::iterator iter; 
     iter=setMyClass.begin(); 
     MyClass &tmpClass2=*iter; 

и ошибка:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &' 

(я удалил части сообщения об ошибке "MVB :: Run ::", чтобы очистить его тоже.)

Если я добавлю предыдущую «константу» к последней строке кода, тогда все работает хорошо, но тогда я не могу изменить значение ...

Это обычное поведение, и я должен, скажем, удалить данные, изменить значения и вернуть их обратно?

У меня такое ощущение, что это связано с сортировкой набора, но я не буду касаться переменных, которые используются для сортировки.

ответ

12

Я вы уверены won't touch the variables that are used for the sorting вы могли бы работать вокруг этого, используя const_cast так:

MyClass tmpClass; 
    std::set<MyClass > setMyClass; 
    setMyClass.insert(tmpClass); 
    std::set<MyClass >::iterator iter; 
    iter=setMyClass.begin(); 
    const MyClass &tmpClass2=*iter; 

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2); 

В качестве альтернативы, вы можете объявить член класса, которые вы собираетесь изменить, как mutable.

+2

Вы можете это сделать, но это плохая практика. –

12

Да, это ожидается. Если вы смогли отредактировать объекты, уже установленные в наборе, прикладной порядок сортировки может перестать применяться, что приведет к неопределенному поведению.

Смежные вопросы