Доступ к защищенной переменной-члену из производного внутреннего класса в шаблонном родительском классе - PullRequest
0 голосов
/ 21 сентября 2018

Я получаю эту ошибку при попытке скомпилировать это:

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 голосов
/ 21 сентября 2018

Вы можете использовать объявление 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.

0 голосов
/ 21 сентября 2018

Как я могу получить доступ к базовым элементам без префикса всех из них через this->?

Вы можете создать private аксессор:

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

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

    LeafIterator() : BaseIterator() {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...