std :: list Итератор не назначен - PullRequest
0 голосов
/ 21 апреля 2011

Извините за неопределенный заголовок вопроса, но у меня есть эти 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) Я получаю ошибки, которые выглядят как проблема неоднозначности.

binary '=': не найден оператор, который принимает правый операнд типа 'std :: _ List_const_iterator <_Mylist>' (или тамнедопустимое преобразование)

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

  with
 [
     _Mylist=std::_List_val<AnimationKeyframe,std::allocator<AnimationKeyframe>>
 ]
  could be 'std::_List_iterator<_Mylist> &std::_List_iterator<_Mylist>::operator =(const std::_List_iterator<_Mylist> &)'
 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 Ответ

6 голосов
/ 21 апреля 2011

Похоже, что that - это const (возможно, постоянная ссылка). begin() const возвращает const_iterator, а не iterator.

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

void foo(const std::vector<int> &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
}
...