Я считаю, что самый простой способ реализации итераторов - это boost :: iterator . Если вы хотите накатить свой, я думаю, что подпись должна быть:
class const_iterator : public std::iterator<std::bidirectional_iterator_tag, const T> {
с той же реализацией (при условии, что вы используете reference_type и т. Д. В сигнатурах функций)