170 похожих чатов

Всем привет! Подскажите пож-та. К сожалению весь код приложить не могу,

он достаточно объемен и состоит из нескольких файлов.
Пишу на 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? Ткните пож-та куда смотреть хотя бы.
(Сигнатуры менять не могу, определены по заданию.)
Спасибо!

3 ответов

7 просмотров

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

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта