он достаточно объемен и состоит из нескольких файлов.
Пишу на C++ реализацию списка, при отладке и компиляции получил ошибку:
error: cannot convert ‘s21::list<int>::iterator’ {aka ‘s21::ListIterator<int>’} to ‘s21::list<int>::const_iterator’ {aka ‘s21::ListConstIterator<int>’}
Дело в том, что я имею два метода (метод с перегрузкой):
iterator end() noexcept { return iterator(head_->prev_); }
const_iterator end() const noexcept { return const_iterator(head_->prev_); }
Итератор и конст-итератор также определены:
using iterator = ListIterator<Type>;
using const_iterator = ListConstIterator<Type>;
Ошибка вылетает при вызове метода (splice) из другого метода (merge).
Сигнатура метода, в котором возникла ошибка:
void splice(const_iterator pos, list& other) noexcept {...}
Метод (из метода merge) вызывается просто:
splice(end(), other);
Собственно, вопрос, почему компилятор не может найти правильный метод end и подставить его в splice? Ткните пож-та куда смотреть хотя бы.
(Сигнатуры менять не могу, определены по заданию.)
Спасибо!
end() отдает не конст итератор, а splise хочет конст итератор. Тебе надо как то вызвать метод end() который конст, изнутри твоего класса-листа, но я не знаю как, я не настолько специалист еще. Может подскажет кто еще тут
Посмотри ка сделаны итераторы для листа тут https://www.inf.usi.ch/carzaniga/edu/sysprog19s/list.pdf и тут https://bytes.usc.edu/files/cs104/slides/L13_Iterators.pdf
Тебе надо сделать как написано в этой книге, в частности вот так iterator begin() { return iterator{head_}; } iterator end() { return iterator{nullptr}; } const_iterator begin() const { return const_iterator{head_}; } const_iterator end() const { return const_iterator{nullptr}; } вот что он пишет Есть еще одно осложнение, которое нужно рассмотреть, прежде чем отказать- ся от этого примера итератора списка. Обратите внимание, что я втихомол- ку изменил нашу шаблонную функцию count_if, и теперь она принимает Container& вместо const Container&! Это потребовалось потому, что функ- циичлены begin() и end() являются неконстантными; а это, в свою очередь, объясняется тем, что они возвращают итераторы, оператор operator* кото- рых возвращает неконстантные ссылки на элементы списка. Нам бы хотелось, чтобы наш тип списка (и его итераторы) имел полноценную константную корректность (constcorrect) – то есть чтобы была возможность определять и использовать переменные типа const list_of_ints и предотвращать воз- можность изменять элементы константного списка. В стандартной библиотеке эта проблема решается реализацией для каждого стандартного контейнера двух видов итераторов: bag::iterator иbag::const_ iterator. Неконстантная функциячлен bag::begin() возвращает iterator, а функциячлен bag::begin() const возвращает const_iterator. Символ подчеркивания важен здесь! Обратите внимание, что bag::begin() const не возвращает простой const iterator; если бы возвращаемый ею итератор был константным, мы не смогли бы применить к нему оператор ++. (Что, в свою очередь, затруднило бы итерации по элементам const bag!) В действитель ности bag::begin() const возвращает нечто более затейливое: неконстант- ный объект const_iterator, оператор operator* которого просто возвращает константную ссылку на его элемент. вот ссылка на книгу - http://lib.jizpi.uz/pluginfile.php/7343/mod_resource/content/0/%D0%9E%D1%81%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%20C%2B%2B17%20STL.%20tlgm%20it_boooks%202019.pdf читай страницу 28
Обсуждают сегодня