Во-первых, вам нужно operator *(void) const
.
[Изменить: в зависимости от вашего существующего оператора, следующее должно сделать:
char &operator *(void) const {
// bounds checking
return *p;
}
]
Во-вторых, вам нужно operator+(int, exscape::string::iterator)
. Довольно распространенный способ написать это (в классе итераторов):
friend const iterator operator+(const int offset, iterator out) {
out += offset;
return out;
}
Обратите внимание, что пометка этого друга делает его функцией, не являющейся членом, даже если она определена внутри класса. Возможно, вы также захотите заменить operator+(int)
функцией, не являющейся членом, operator+(iterator,int)
, просто чтобы получить те же правила неявного преобразования, которые применяются к LHS и RHS +.
[Другое редактирование: как вы указали в своем комментарии, оператор + не должен возвращать const iterator
в любом случае - просто верните iterator
. Так что для вашего примера кода вам на самом деле не нужен operator*()const
. Но в любом случае он должен быть, потому что пользователи могут захотеть писать код, используя const-модифицированные экземпляры вашего класса.]
Наконец, стандартные контейнеры с итераторами произвольного доступа (включая std :: string) определяют difference_type
со знаком в качестве члена класса. int
может быть недостаточно большим, чтобы содержать все возможные смещения (например, в архитектуре LP64), но ptrdiff_t
является хорошим кандидатом.