Нет типа с именем value_type в чертах итератора

Я пытаюсь написать набор связанных списков, совместимый со стандартной библиотекой, и получаю ошибку, которую не могу понять.

#include <iterator>
#include <cstddef>
template <typename T>
class SetList{
struct ListNode{
T data;
ListNode * next;
ListNode(T newData, ListNode* newNext): data(newData), next(newNext){}

ListNode(ListNode& l): data(l.data), next(l.next){}
ListNode& operator=(ListNode & l){
data = l.data;
next = l.next;
return this;
}
};

public:
ListNode* head;
typedef T value_type;
class iterator;
typedef iterator iterator_type;
class const_iterator;

SetList(): head(nullptr){}
~SetList(){
//delete entire list
}
SetList(SetList<T>& sl): head(sl.head){}

iterator begin(){
return iterator(head);
}
iterator end(){
return iterator(nullptr);
}

class iterator
{
//traits
friend class SetList;
friend class const_iterator;
typedef std::forward_iterator_tag iterator_category;
typedef iterator self_type;
typedef T value_type;
typedef T& reference;
typedef T* pointer;
typedef int difference_type;
private:
ListNode* ihead;
public:
iterator(ListNode* newHead = nullptr): ihead(newHead){}
iterator(const iterator& it): ihead(it.ihead){}
iterator& operator=(iterator& it){ihead = it.ihead; return *this;}
reference operator*(){return ihead->data;}
pointer operator->() const{ return ihead;}
iterator& operator++(){ihead = ihead->next; return *this;}
bool operator!=(const iterator& it) const{
return ihead != it.ihead;
}
bool operator==(const iterator& it) const{
return ihead == it.ihead;
}
};
class const_iterator
{
//traits
friend class SetList;
friend class iterator;
typedef std::forward_iterator_tag iterator_category;
typedef const_iterator self_type;
typedef T value_type;
typedef T& reference;
typedef T* pointer;
typedef int difference_type;
private:
const ListNode* ihead;
public:
const_iterator(const ListNode* newHead = nullptr): ihead(newHead){}
const_iterator(const iterator& it): ihead(it.ihead){}
const_iterator(const const_iterator& it): ihead(it.ihead){}
const_iterator& operator=(const const_iterator& it){ihead = it.ihead; return *this;}
const_iterator& operator=(const iterator& it){ihead = it.ihead; return *this;}
reference operator*()const {return ihead->data;}
pointer operator->() const{ return ihead;}
const_iterator& operator++(){ihead = ihead->next; return *this;}
bool operator!=(const const_iterator& it) const{
return ihead != it.ihead;
}
bool operator==(const const_iterator& it) const{
return ihead == it.ihead;
}
};

public:
void insert(T newData){
if(head){
ListNode* cur = new ListNode(newData, head);
head = cur;
}else{
head = new ListNode(newData, nullptr);
}
}
SetList& operator=(SetList& sl){

}

};

Сообщение об ошибке:
ошибка

Это говорит о том, что он не может найти определенные типы в iterator_traits, но я не понимаю, как то, что делает мой код, имеет какое-то отношение к тому, какие типы там определены.

-1

Решение

Вы объявили все типы в итераторе как частные Определения типов поэтому они недоступны из iterator_traits, Если вы измените:

    friend class SetList;
friend class const_iterator;
typedef std::forward_iterator_tag iterator_category;
typedef iterator self_type;
typedef T value_type;

чтобы:

            friend class SetList;
friend class const_iterator;
public:
typedef std::forward_iterator_tag iterator_category;
typedef iterator self_type;
typedef T value_type;
//...

код компилируется. Ошибки компилятора говорят о том, что вы использовали std::copy Алго с SetListниже приведен код, который прекрасно работает после того, как typedefs в итераторе стали публичными:

SetList<int> sl;
sl.insert(1);
std::vector<int> v;
std::copy(sl.begin(), sl.end(), std::back_inserter(v));
for (int i : v)
std::cout << i << std::endl;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]