没有基类的限定符,派生类将无法访问基类的受保护成员变量

时间:2018-10-10 15:03:51

标签: c++ vector data-structures

#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>;
};
};

1 个答案:

答案 0 :(得分:1)

这仅仅是C ++的模板名称查找规则的结果。您也可以使用this->代替基类限定符。基本上,为了使查找依赖于模板参数,您必须使用该模板参数(即使通过typedefusing间接使用)作为名称的一部分。请注意,默认情况下,MSVC仍然不强制执行此操作,您必须使用/permissive-标志才能在MSVC中获得此行为。