尝试编译此错误:
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
只是为许多不同的(但工作方式相似)迭代器保留了公共成员。我可以在所有迭代器中复制所有成员并完成它,但是我想重用一个通用/通用接口。
答案 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中可以正常编译。