#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
}