std:: итератор списка не назначается

#c #stl #iterator #variable-assignment #ambiguity

#c #stl #итератор #переменная-назначение #двусмысленность

Вопрос:

Извините за расплывчатый заголовок вопроса, но у меня здесь есть эти typedefs:

 typedef std::list<AnimationKeyframe> Timeline;
typedef Timeline::iterator Keyframe;
  

и давайте предположим, что класс, подобный этому:

 class foo
{
Timeline timeline;
Keyframe left,right;
};
  

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

 Keyframe myTemp, hisTemp;
this->left = this->timeline.begin(); // assigns
myTemp = this->timeline.begin(); // assigns
hisTemp = that.timeline.begin() // does not assign
  

как только я пытаюсь назначить ключевой кадр с одним из ‘that’ (другой foo) Я получаю ошибки, которые выглядят как проблема неоднозначности.

двоичный файл ‘=’ : не найден оператор, который принимает правый операнд типа ‘std::_List_const_iterator<_Mylist>’ (или нет приемлемого преобразования)

Дополнительная информация:

   with
 [
     _Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
 ]
  could be 'std::_List_iterator<_Mylist> amp;std::_List_iterator<_Mylist>::operator =(const std::_List_iterator<_Mylist> amp;)'
 with
 [
     _Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
 ]
 while trying to match the argument list '(Keyframe, std::_List_const_iterator<_Mylist>)'
 with
 [
     _Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
 ]
  

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

Ответ №1:

Это выглядит так, как будто that is const (возможно, ссылка const). begin() const возвращает a const_iterator , а не an iterator .

Причина отсутствия преобразования из const_iterator в iterator заключается в следующем:

 void foo(const std::vector<int> amp;vec) {
    std::vector<int>::iterator it = vec.begin(); // if this compiled...
    *it = 5;  // then this would attempt to modify a vector taken by const ref
}