Шаблон Friend для Суперкласса - PullRequest
0 голосов
/ 28 июля 2011

У меня есть нешаблонный класс (Par_list_elem), и я хотел бы предоставить доступ к его внутренним компонентам для класса Par_list (для создания навязчивого списка).

Подвох: мне нужны Par_list_elem и все его подклассы должны быть доступны Par_list.Подробно, единственные поля, которые должны быть доступны, это _next и _prev;было бы неплохо явно ограничить эти поля, но не обязательно.

Я сделал несколько предварительных попыток сделать это, последняя из которых приведена ниже:

        template <class T> class Par_list {
            public:

                    Par_list() : _head(0) {}
                    ~Par_list();

                    //Insert element into list
                    bool insert(T elem);


                    //Remove element identified by iterator
                    void erase(iterator itr);

            private:
                    T* _head;
    };


    class Par_list_elem {
            public:
                    Par_list_elem() : _next(0), _prev(0) {}
                    //Get next element in list
                    Par_list_elem* next() { return _next; }

            private:
                    Par_list_elem* _next;
                    Par_list_elem* _prev;

                    template <typename> friend class Par_list;
    };




    template <class T> void Par_list<T>::erase(Par_list<T>::iterator itr) {

        T* e = *itr;

        T* p;
        if ((p = e->_prev) != 0)
                p->_next = e->_next;
        else
                _head = e->_next;

        if ((e->_next) != 0)
                (e->_next)->_prev = p;

        delete e;
    }

    template <class T> bool Par_list<T>::insert(T* nelem) {

        T* curr = _head;
        if (curr != 0)  {
                while (curr->_next != 0)
                        curr = curr->next();
                curr->_next = nelem;
        } else
                _head = nelem;

        nelem->_prev = curr;
        nelem->_next = 0;

        return true;
}

test.cpp

#include "parsnip_list_back.h"

class elem : parsnip::Par_list_elem {
    int _elem;
};

int main (int argc, char** argv) {

    parsnip::Par_list<elem> plist;

    return 0;
}

Некоторая информация, кажется, доступна здесь: Шаблон друга Но цель отличается достаточно подробно, что я застрял.

Спасибо!

-------- ОБНОВЛЕНИЕ ---------

Следующий тип ошибки происходит для каждого экземпляра доступа частного члена Par_list_elem.Я собираю на GCC 4.4.

parsnip_list_back.h:66: error: ‘parsnip::Par_list_elem* parsnip::Par_list_elem::_prev’ is private
parsnip_list_back.h:124: error: within this context

Итак, при текущей реализации даже суперкласс не отказывается от своих привилегий.

1 Ответ

1 голос
/ 28 июля 2011

Проблема в том, что вы наследуете в частном порядке от Par_list_elem.Таким образом, хотя Par_list может получить доступ к закрытым членам базового класса, он не может получить доступ к самому базовому классу.

Мне нужно Par_list_elem и всех его подклассов доступно для Par_list.

Это решило бы проблему, если бы это было возможно, но это невозможно сделать;дружба не наследуется.

Самое простое решение - наследовать публично.

...