То, что происходит, - то, что класс итератора - фактически просто определение типа для класса pre_order_traversal. Поэтому, когда вы устанавливаете результат gameTree.beginLeaf()
(который возвращает leaf_iterator) для итератора, он вызывает конструктор копирования pre_order_iterator, потому что есть конструктор, определенный для pre_order_traversal(const iterator_base&)
(iterator_base является суперклассом для всех других итераторов, включая leaf_iterator) , так что это создает новый pre_order_iterator из leaf_iterator. Затем, когда вы используете этот итератор, он выполняет обход в глубину, а не перебирает листья. Если вы переключитесь на leaf_iterator вместо итератора, проблема исчезнет.
Именно поэтому прямая форма, упомянутая в комментарии ниже (где значение не присваивается итератору), работает правильно.