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

Posted

技术标签:

【中文标题】STL 迭代器继承:“value_type”未命名类型【英文标题】:STL Iterator Inheritance : 'value_type' does not name a type 【发布时间】:2018-04-05 21:05:06 【问题描述】:

我一直在试图理解这个错误的来源:

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;

为什么会出现这个编译错误?

【问题讨论】:

@CoryKramer 由基类std::iterator提供 【参考方案1】:

使用时:

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>

【讨论】:

非常感谢!失明了。

以上是关于STL 迭代器继承:“value_type”未命名类型的主要内容,如果未能解决你的问题,请参考以下文章

什么时候使用迭代器的`value_type`?

如何从 STL 类“继承”迭代器?

具有复杂值类型的迭代器:与value_type和引用混淆

STL 集合的解引用迭代器

SGI-STL简记-迭代器解析

traits编程技法