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

Access to protected member variable from derived inner class in a templated parent class

本文关键字:访问 内部类 受保护 成员 变量 派生 父类      更新时间:2023-10-16

我在尝试编译它时收到此错误:

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只是为许多不同的(但工作相似(的迭代器保存公共成员。我可以复制所有迭代器中的所有成员并完成它,但我想重用一个通用/通用接口。

您可以使用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 中编译得很好。

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

您可以创建private访问器:

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