1) Унаследовались от std::iterator вы неверно. Второй параметр это тип который должен получится после разыменования. Если оператор * возвращает Т, то ставьте Т параметром.
2)
MyIterator подтягивает из std::iterator определенные в нем операторы (* и ->),
Какие определённые операторы? std::iterator определяет несколько алиасов типов, вот и всё.
Вам нужно:
а) Хранить в итераторе указатель на ноду.
б) Операторы ++ и -- переводят указатель на следующую/предыдущую ноду
в) Операторы * и -> обращаются к данным в текущей ноде.
Как-то так:
template <typename T>
struct Node
{
T data;
Node* next;
Node* prev;
};
template <typename T>
class list_iterator : public std::iterator<std::bidirectional_iterator_tag, T>
{
private:
Node<T>* current;
public:
list_iterator& operator++()
{
current = current->next;
return *this;
}
T& operator*()
{
return current->data;
}
};