【问题标题】:Template Friend for Superclass超类的模板朋友
【发布时间】:2011-10-14 17:24:26
【问题描述】:

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

这里似乎有一些信息: Template friend 但是目标在细节上有所不同,以至于我被卡住了。

谢谢!

--------更新---------

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

因此,在当前的实现中,即使是超类也不会放弃它的私有属性。

【问题讨论】:

  • 这真的没有意义;你说你需要访问“它的所有子类”,但是你只需要访问基类中定义的字段——这正是代码中friend 声明给你的。究竟是什么问题?
  • Par_class 无法访问 Par_list_elem 子类的 _next 和 _prev 字段。这有意义吗?
  • 应该可以,因为它们是具有friend 声明的类的成员,而不是子类的成员,并且在我尝试时确实如此。你用的是什么编译器?你遇到了什么错误?你能发布一个Par_list_elem 的子类的示例,以及Par_list 中的一些代码尝试访问这些成员之一吗?
  • 我已经用一些额外的信息更新了原始帖子。我应该更清楚地知道出了什么问题:超类在这一点上也不友好。此外,这是一个使用上述代码编译的示例子类,但当前 (key) 未报告任何错误:class elem : Par_list_elem { int _elem; };
  • 请制作一个完整的、独立的、最小的示例来说明您的问题。您发布的代码甚至没有引用任何私人成员。您的错误消息是指您未发布的代码。不可能说你做错了什么。

标签: c++ class templates friend


【解决方案1】:

问题是您从Par_list_elem 继承私下。所以,虽然Par_list 可以访问基类的私有成员,但它不能访问基类本身。

我需要Par_list_elem它的所有子类 才能被Par_list 访问。

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

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

【讨论】:

  • 所以想法是因为 elem 是公开继承的,所以 Par_list 保证原始私有 _next 和 _prev 字段不会被子类修改,所以没关系。 Par_list 使用它们?另外:非常感谢!像魅力一样工作。
  • 好的,我的最后一条评论很混乱。因为唯一的基类成员(为简单起见忽略 next())是私有的,所以成员可访问性不会被继承访问说明符修改。那么只有公共继承提供对基类本身的访问吗?而访问基类本身是恢复基类好友的唯一途径吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
相关资源
最近更新 更多