У меня есть вектор объектов Car, объявленный как
vector<Car> vCars
В одной из моих функций мне нужно стереть первый элемент вектора. Звучит достаточно просто, верно? Строка, которая выдает ошибку:
vCars.erase( vCars.begin() );
И ошибка:
no matching function for call to 'std::vector<Car>::erase(std::vector<Car>::const_iterator) const'
Я понимаю, что стирание обычно принимает только итератор для своего параметра, а не const_iterator. Я искал решения или обходные пути для ошибки, такие как идиома erase-remove, но из того, что я вижу, он удаляет элемент только по значению, когда мне нужно удалить по позиции — и достаточно просто, просто элемент на первой позиции! (Я знаю, что это не очень хорошая производительность для вектора, но я должен использовать вектор для этого)
редактировать: чтобы прояснить ситуацию, функция, в которой содержится вызов, находится ниже:
/// Removes the Car at the front of the garage without returning the instance.
void Garage::pop() const {
if ( !empty() ) {
vCars.erase( vCars.begin() );
}
}
Редактировать: И теперь я вижу, где я ошибся. Было много методов, которые были const, и я просто бездумно сделал pop () методом const! Как только я удалил const, проблема была решена. Спасибо, что указал мне правильное направление!
Сообщение об ошибке:
нет соответствующей функции для вызова ‘std :: vector :: erase (std :: vector :: const_iterator) const’
подразумевает, что vCars.begin()
дает const_iterator
что, в свою очередь, означает, что vCars
постоянный объект или ссылка. Вы не можете изменять вектор с помощью этой ссылки. Если функции необходимо изменить вектор, она не может принимать постоянную ссылку.
Обратите внимание, что в функции-члене, объявленной как const
неявный this
указатель имеет тип T const *
(то есть вы не можете изменить объект внутри константной функции). Если это ваш случай, вам нужно будет const
классификатор из функции.
Это не то erase
работает только для iterator
с, это также работает для const_iterator
s в C ++ 11. в конце концов, чтобы вызвать стирание, вам нужна модифицируемая ссылка на вектор, и если у вас есть это, вы всегда можете получить обычный неконстантный iterator
из const
один. Это обоснование того, почему они изменили члена, чтобы принять const_iterator
,
Проблема в том, что вы получаете только const_iterator
обратно из begin()
если объект, на который вы его вызываете, тоже const
квалифицированный — в этом случае ваш vCars
, Это, в свою очередь, означает, что вы можете только позвонить const
квалифицированные функции на нем, что пытается компилятор:
... вызов 'std :: vector :: erase (std :: vector :: const_iterator) const' ^^^^^
Я думаю, что вы согласны с тем, что erase
являющийся const
квалифицированный не имеет смысла. 🙂
Кажется, ваш параметр «vCars» является константной ссылкой на вектор. Вы можете сделать его изменяемым через const_cast или изменить дизайн вашей функции.