Перегрузка операторов при использовании итератора структуры

Разрабатываю структура двусвязного списка на основе адресных указателей. Также в задание входит разработка собственного класса итератора для структуры. Итератор имеет набор стандартных операций со структурой, в том числе стандартные перегрузки. Проблема заключается именно в том, что у меня получилось перегрузить оператор * для вывода значения итератора cout << *iterator, но не получается сделать *iterator = 5, то есть изменить значение элемента структуры с помощью итератора.

// List.h

template <class T>
class List {
public:
    List();     
    List(const List& list); 
    ~List();        

    class Node {    
    friend class List;
    private:
        T data;     
    public:
        Node* next; 
        Node* prev;
        Node() {    
            next = nullptr;
            prev = nullptr;
        }
        ~Node() {}
    };

private:
    int size;       
    Node* head;     
    Node* tail; 

public:
    class Iterator;
    Iterator begin();
    Iterator end();
};

template <typename T>
class List<T>::Iterator {
public:
    Iterator(); 
    Iterator(Node* ptr);    
    Iterator& operator++(); 
    Iterator& operator--(); 
    bool operator==(const Iterator& iter);  
    bool operator!=(const Iterator& iter);  
    T operator*();  

private:
    Node* current;
};

template <typename T>
List<T>::Iterator::Iterator() {
    current = nullptr;
}

template <typename T>
List<T>::Iterator::Iterator(Node* ptr) {
    current = ptr;
}

template <typename T>
T List<T>::Iterator::operator*() {
    if (current != nullptr)
        return current->data;
    else
        cerr << "The iterator isn't set.";
}
// main.cpp

List<int> list;
list.add(1);
list.add(2);
list.add(3);
List<int>::Iterator iter;
iter = list.begin();
*iter = 5;

Ошибка:

error C2106: =: левый операнд должен быть левосторонним значением


Ответы (1 шт):

Автор решения: Кирилл Чуркин

Вы должны возвращать ссылку на элемент. При этом учитывая, что в пустом конструкторе вы инициализируете указатель как nullptr, вы должны так же бросить исключение, если указатель nullptr.

T& operator* () { 
    if (current) return current->data;
    throw std::exception("node pointer is unitializated");
}
→ Ссылка