#include <iostream>
#include <utility>
template <typename Object>
class Vector {
class const_iterator {
public:
const Object& operator * () const { return retrieve(); }
const_iterator& operator ++ () {
++current;
return *this;
}
const_iterator operator ++ (int) {
auto old { *this};
++( *this);
return old;
}
bool operator == (const const_iterator& rhs) const { return current == rhs.current; }
bool operator != (const const_iterator& rhs) const { return !( *this == rhs); }
protected:
Object* current;
const Vector<Object>* theVect;
Object& retrieve() const {
assertIsValid();
return *current;
}
const_iterator(const Vector<Object>& vect, Object* p)
: theVect { &vect}, current {p} { }
void assertIsValid() const {
if (theVect == nullptr || current == nullptr) {
// throw IteratorOutOfBoundsException();
}
}
friend class Vector<Object>;
};
class iterator : public const_iterator {
public:
const Object& operator * () const { return const_iterator::operator * (); }
Object& operator * () { return const_cast<Object& > (std::as_const( *this).operator * () ); }
iterator& operator ++ () {
为什么没有“ const_iterator ::”就无法访问当前的?
但是“ ++ const_iterator :: current”是可以的。
这里发生了什么?有人可以帮我吗?非常感谢你!!!
++current;
return *this;
}
iterator operator ++ (int) {
auto old { *this};
++ ( *this);
return old;
}
protected:
iterator(const Vector<Object>& vect, Object* p)
: const_iterator(vect, p) { }
friend class Vector<Object>;
};
};
答案 0 :(得分:1)
这仅仅是C ++的模板名称查找规则的结果。您也可以使用this->
代替基类限定符。基本上,为了使查找依赖于模板参数,您必须使用该模板参数(即使通过typedef
或using
间接使用)作为名称的一部分。请注意,默认情况下,MSVC仍然不强制执行此操作,您必须使用/permissive-
标志才能在MSVC中获得此行为。