Наследование итератора STL: тип_значения не называет тип

Я застрял, пытаясь понять, откуда эта ошибка:

error: ‘value_type’ in ‘struct std::iterator_traits<sha::Vector<int>::h_iterator>’ does not name a type

Я пытаюсь создать std::vector Оберните и наследуйте итератор также.
Я не понимаю, почему компилятор не может вывести «value_type» или «diff_type».

Вот мое определение класса:

  template <typename T>
class Vector
{
public:
explicit Vector(std::initializer_list<T> init) : data(init) {}
~Vector() {}

class h_iterator : std::iterator<std::random_access_iterator_tag, T>
{
public:
h_iterator(typename std::vector<T>::iterator it,
Vector<T>* owner) :
it(it), owner(owner) {}

T operator *() const { return *it; }
const h_iterator &operator ++() { ++it; return *this; }
h_iterator operator ++(int) { h_iterator copy(*this); ++it; return copy; }
const h_iterator &operator --() { --it; return *this; }
h_iterator operator --(int) { h_iterator copy(*this); --it; return copy; }
h_iterator& operator =(const h_iterator& other){ this->it =other.it; return *this;}

bool operator ==(const h_iterator &other) const { return it == other.it; }
bool operator !=(const h_iterator &other) const { return it != other.it; }
bool operator  <(const h_iterator &other) const { return it  < other.it; }
bool operator  >(const h_iterator &other) const { return it  > other.it; }
bool operator <=(const h_iterator &other) const { return it <= other.it; }
bool operator >=(const h_iterator &other) const { return it >= other.it; }

h_iterator operator +(const long int &delta) const
{
h_iterator copy(*this);
it += delta;
return copy;
}

h_iterator& operator +=(const long int& delta)
{
it = it + delta;
return *this;
}

h_iterator operator -(const long int &delta) const
{
h_iterator copy(*this);
it -= delta;
return copy;
}

h_iterator& operator -=(const long int& delta)
{
it = it - delta;
return *this;
}

T operator [](const long int &delta) const { return *(it + delta); }

private:
typename std::vector<T>::iterator it;  // Iterator
Vector<T>* owner;                      // Cannot be null as long as the iterator is valid
};

// Preserve normal iterator accesses
typename std::vector<T>::iterator begin() { return data.begin(); }
typename std::vector<T>::iterator end() { return data.end(); }

const typename std::vector<T>::iterator cbegin() const { return data.cbegin(); }
const typename std::vector<T>::iterator cend() const { return data.cend(); }

// Observale iterator
h_iterator h_begin() { return h_iterator(data.begin(), this); }
h_iterator h_end() { return h_iterator(data.end(), this); }

// Implement Meta-Language functions
//...

private:
Vector() {}
Vector operator=(Vector&) {} // Not Implemented

std::vector<T> data;            // Vector wrapper
};

Вот код, который делает сборку неудачной:

typedef Vector<int> Container;
typedef Container::h_iterator IT;
typedef std::less<typename
std::iterator_traits<Vector<int>::h_iterator>::value_type> Compare;

Почему происходит эта ошибка компиляции?

0

Решение

Когда вы используете:

class h_iterator : std::iterator<std::random_access_iterator_tag, T>

базовый класс private Базовый класс. Детали базового класса недоступны для клиентов h_iterator, Сделать вывод public,

class h_iterator : public std::iterator<std::random_access_iterator_tag, T>
5

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

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

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