我有一個非模板化類(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 但是我的目標不同於足夠的細節,我被困住了。
謝謝!
-------- --------- 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
因此,在目前的實施情況下,即使超類也沒有放棄它的私有。
這真的沒有道理;你說你需要訪問「所有的子類」,但是你只需要訪問基類中定義的字段 - 這正是你的代碼中的'friend'聲明給你的。究竟是什麼問題? –
Par_class無法訪問Par_list_elem的子類的_next和_prev字段。那有意義嗎? – bcr
它應該是能夠的,因爲它們是具有'friend'聲明的類的成員,而不是子類的成員,並且當我嘗試它時它就成功了。你使用什麼編譯器?你遇到了什麼錯誤?你可以發佈一個'Par_list_elem'的子類的示例,並且'Par_list'中的一些代碼試圖訪問這些成員之一? –