从模板化父类的派生内部类访问受保护的成员变量

时间:2018-09-21 11:13:18

标签: c++ templates inheritance

尝试编译此错误:

template <typename T>
struct Temp
{
    struct BaseIterator
    {
    protected:
        int  pos;
        BaseIterator() : pos(0) {}
    };

    struct LeafIterator : public BaseIterator
    {
        int * operator * () { return &pos; }

        LeafIterator() : BaseIterator() {}
    };
};

返回:

prog.cpp: In member function ‘int * Temp<T>::LeafIterator::operator*() const’:
prog.cpp:24:52: error: ‘pos’ was not declared in this scope
             int * operator * () { return &pos; }

没有父Temp结构的相同代码可以正常工作,而Temp结构不是模板时的代码也可以正常工作。同样,即使基本成员是public,我仍然会收到编译器错误。

我知道我可以通过this->pos来引用继承的成员,但是在代码中的任何地方添加this->确实很痛苦。

如何访问基本成员而不必通过this->给所有基本成员添加前缀?

编辑:BaseIterator只是为许多不同的(但工作方式相似)迭代器保留了公共成员。我可以在所有迭代器中复制所有成员并完成它,但是我想重用一个通用/通用接口。

2 个答案:

答案 0 :(得分:2)

  

如何访问基本成员而不必通过this->给所有基本成员添加前缀?

您可以创建一个private访问者:

class LeafIterator : public BaseIterator
{
private:
    int& pos() { return this->pos; }

public:
    int * operator * () { return &pos(); }

    LeafIterator() : BaseIterator() {}
};

答案 1 :(得分:2)

您可以使用using声明。

template <typename T>
struct Temp
{
    struct BaseIterator
    {
    protected:
        int  pos;
        BaseIterator() : pos(0) {}
    };

    struct LeafIterator : public BaseIterator
    {
        using BaseIterator::pos;
        int * operator * () { return &pos; }

        LeafIterator() : BaseIterator() {}
    };
};

int main()
{
    Temp<int>::LeafIterator leaf_iterator;
}

在GCC 8.2.0中可以正常编译。