繁体   English   中英

STL迭代器继承:“ value_type”未命名类型

[英]STL Iterator Inheritance : 'value_type' does not name a type

我一直试图了解此错误的来源:

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

我正在尝试创建一个std::vector包装器并继承迭代器。 我不明白为什么编译器无法推断'value_type'或'difference_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;

为什么会发生此编译错误?

使用时:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM