父类的模板友元
Template Friend for Superclass
我有一个非模板化的类(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
访问。
如果可能的话,这将解决问题,但这是不可能的;友谊不是遗传的。
相关文章:
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 如何在嵌套类中正确使用友元声明?
- 继承和友元函数,从基类访问受保护的成员
- 将子类方法声明为基类的友元
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 使第二个类的构造函数成为第一个类中的友元函数
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 未定义的类模板不会实例化以检查友元函数
- 将派生类的构造函数声明为父类的友元
- 为什么要将父类定义为友元类
- Visual Studio 2010 中的友元模板类和 Lambda 函数
- 传递指针到声明为友元的类成员的pthread
- 使用模板参数友元从类继承
- 父类的模板友元
- 友元函数类内定义只允许在非本地类定义中使用.什么意思