父类的模板友元

Template Friend for Superclass

本文关键字:友元 父类      更新时间:2023-10-16

我有一个非模板化的类(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

所以,在当前的实现中,即使是超类也不会放弃它的private

问题是您正在从Par_list_elem私有地继承。因此,尽管Par_list可以访问基类的私有成员,但它不能访问基类本身。

我需要Par_list_elem它的所有子类都可以被Par_list访问。

如果可能的话,这将解决问题,但这是不可能的;友谊不是遗传的。