T*
не подходит в качестве итератора связанного списка, так как при увеличении он не может добраться до следующего узла в списке. Кроме того, &_head.get()->data
недопустимо, когда список пуст.
И Node*
также не будут работать ни для iterator
, ни для const_iterator
, поскольку у него не может быть действительного operator++
итерацию списка или operator*
для доступа к data
. См. Требования к ForwardIterator .
. Вам лучше определить отдельный тип, который будет действовать как (const_)iterator
, и пусть он будет содержать Node*
внутри для итераций и разыменования, например:
template<typename T>
class MyList {
public:
class Node {
public:
Node(const T& data): data(data) {}
std::unique_ptr<Node> next;
T data;
};
template<typename D>
class my_iterator
{
public:
my_iterator(Node* node) : _current(node) {}
bool operator==(const my_iterator &rhs) const { return _current == rhs._current; }
D& operator*() { return _current->data; }
D* operator->() { return &(_current->data); }
my_iterator& operator++() { _current = _current->next.get(); return *this; }
my_iterator operator++(int) { my_iterator tmp(_current); ++(*this); return tmp; }
private:
Node* _current;
};
using iterator = my_iterator<T>;
using const_iterator = my_iterator<const T>;
...
iterator begin() {
return iterator(_head.get());
}
const_iterator cbegin() const {
return const_iterator(_head.get());
}
iterator end() {
return iterator(nullptr);
}
const_iterator cend() const {
return const_iterator(nullptr);
}
...
};