Вам необходимо указать пять типов, либо внутри самого класса:
template <class Container>
struct NodeTableIterator {
using iterator_category = /* ... */;
using value_type = /* ... */;
using difference_type = /* ... */;
using pointer = /* ... */;
using reference = /* ... */;
// ...
};
, либо в рамках пользовательской специализации std::iterator_traits
. В противном случае отправка тега для категории итераторов в стандартных алгоритмах не будет работать.
Ссылка: [iterator.traits] / 1 (типы в std::iterator_traits
:должен присутствовать)
Чтобы реализовать алгоритмы только в терминах итераторов, часто необходимо определить типы значений и разностей, которые соответствуют конкретному типу итераторов. Соответственно, требуется, чтобы, если Iterator
был типом итератора, типы
iterator_traits<Iterator>::difference_type
iterator_traits<Iterator>::value_type
iterator_traits<Iterator>::iterator_category
были определены как тип разницы итератора, тип значения и категория итератора, соответственно. Кроме того, типы
iterator_traits<Iterator>::reference
iterator_traits<Iterator>::pointer
должны быть определены как ссылочный тип и указатель итератора, то есть для объекта итератора a
тот же тип, что и тип *a
и a->
соответственно. В случае выходного итератора типы
iterator_traits<Iterator>::difference_type
iterator_traits<Iterator>::value_type
iterator_traits<Iterator>::reference
iterator_traits<Iterator>::pointer
могут быть определены как void
.
[iterator.traits] / 2 (типы в std::iterator_traits
могут быть сгенерированы из типов элементов)
Если Iterator
имеет действительные ([temp.deduct]) типы элементов difference_type
, value_type
, pointer
,reference
и iterator_category
, iterator_traits<Iterator>
должны иметь в качестве общедоступных членов следующее:
using difference_type = typename Iterator::difference_type;
using value_type = typename Iterator::value_type;
using pointer = typename Iterator::pointer;
using reference = typename Iterator::reference;
using iterator_category = typename Iterator::iterator_category;
В противном случае iterator_traits<Iterator>
не должно иметь членов с любым из указанных выше имен.