超类的模板朋友

时间:2011-07-28 00:01:43

标签: c++ class templates friend

我有一个非模板化的类(Par_list_elem),我想将其内部访问权限提供给Par_list类(以构建一个侵入式列表)。

问题:我需要Par_list可以访问Par_list_elem和所有子类。详细地说,唯一需要访问的字段是_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;
}

这里似乎提供了一些信息: Template friend 但目标不同,我已经陷入了足够的细节。

谢谢!

-------- --------- UPDATE

对于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 个答案:

答案 0 :(得分:1)

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

  

Par_list_elem可以访问Par_list所有子类

如果有可能,这将解决问题,但无法完成;友谊不是继承的。

最简单的解决方案是公开继承。