私はテンプレート化されていないクラス(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'のサブクラスの例と、これらのメンバーの1つにアクセスしようとする' Par_list'のコードを投稿できますか? –