Эта строка:
myiterator& operator++(int) {myiterator tmp(*this); operator++(); return tmp;}
Должно быть:
myiterator operator++(int) {myiterator tmp(*this); operator++(); return tmp;}
// ^^^^ Not return by reference.
// Don't worry the cost is practically nothing for your class
// And will probably be optimized into copying the pointer back.
В качестве примечания:
На самом деле вам не нужен конструктор копирования:
myiterator(const myiterator& mit) : p(mit.p) {}
Версия, сгенерированная компилятором, будет работать отлично (правило трех / четырех не применяется, поскольку у вас нет указателя RAW, содержащегося в вашем классе).
Ваши операторы сравнения, вероятно, должны быть помечены как const, и я лично предпочитаю определять оператор! = В терминах оператора == и позволить компилятору оптимизировать любую неэффективность (хотя это всего лишь личное). *
bool operator==(const myiterator& rhs) const {return p==rhs.p;}
bool operator!=(const myiterator& rhs) const {return !(*this == rhs);}
// ^^^^^^^ Added const
Оператор *, вероятно, должен иметь две версии. Обычная и постоянная версия.
int& operator*() {return *p;}
int const& operator*() const {return *p;}
В качестве последнего примечания: указатель сам по себе является итератором. Так что на самом деле вам не нужно оборачивать указатели, чтобы сделать их итераторами, они будут правильно работать как итераторы (и не только входные итераторы, но итераторы с произвольным доступом).