| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Итератор для класса на основе list |
| Автор: rattick 26.11.2010, 03:20 | ||
| Здравствуйте. Есть класс в основе которого лежит контейнер list. Необходимо определить для него ряд методов. С обычными методами проблем не возникло, а вот с методами возвращающими и принимающими итераторы возникли проблемы. Собственно вопрос в том, как объявить итератор для моего класса?
и как я понимаю там же надо будет определять перегрузку операторов? |
| Автор: boostcoder 26.11.2010, 05:35 | ||
так:
http://liveworkspace.org/code/a993e7b86902c23362d07702d9f5c086 |
| Автор: rattick 26.11.2010, 06:13 | ||||
| Огромное спасибо!!!!! вот как оказывается
а я делал
и компилятор ругался. Кстати, а почему именно так надо? |
| Автор: Леопольд 26.11.2010, 09:15 | ||
| Потому что имя std::list<T>::iterator зависит от параметра шаблона "T". Шаблоны можно специализировать, и одинаковым именам придавать разный смысл, typename - указание компилятору что это имя типа (а не переменной, функции и т.д.)
typename нужен только внутри шаблонов (на этапе, когда "T" ещё не параметризирован конкретным типом): http://liveworkspace.org/code/ff8a9e45b7d444d75f39260af3373c93 |
| Автор: maxim1000 26.11.2010, 09:54 |
| иногда есть смысл обернуть итератор списка в свой причина стадартная - не выставлять слишком много деталей реализации наружу в данном случае интерфейс итератора из нового класса определяется интерфейсом итератора списка, а не потребностями пользователя нового класса, поэтому пользователи могут завязываться на любые особенности списков например, списки поддерживают операцию http://www.cplusplus.com/reference/stl/list/splice/, итератор нового класса тоже будет годиться для этой операции, вполне возможно, что пользователи класса этим воспользуются, а когда автор класса захочет сменить контейнер, его будет ждать неприятный сюрприз - он поломает кучу кода реализовать обёртку несложно - можно использовать boost::iterator_facade и написать пару методов (которые вызывают соответствующую функциональность list:iterator) |