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”未命名类型的主要内容,如果未能解决你的问题,请参考以下文章