テンプレートクラスのペアで構成されたツリーがあり、そのうちの1つは他のプライベートメンバーにアクセスする必要があり、できれば実際にアクセスする必要があるメンバー関数のみに制限されています。これは私のクラスの簡略図です:
// Forward declaration
template <typename K, typename V> class Tree;
template <typename K, typename V> class Node {
public:
typedef typename Node<K, V>* NodeP;
// ...
private:
K key;
V val;
// Child nodes
NodeP left;
NodeP right;
};
template <typename K, typename V> class Tree {
public:
typedef typename Node<K, V>::NodeP NodeP;
// ...
void clear() { del(root); }
private:
// Root node
NodeP root;
void del(NodeP start)
{
if (start->left != NULL)
del(start->left);
if (start->right != NULL)
del(start->right);
delete start;
}
};
私が理解できないのは、del()
(および Tree の他のメンバー関数) をfriend
Node クラスの として宣言する方法です。次の行で、クラス全体を a にしようとしましたfriend
:
template <typename K, typename V> friend class Tree;
それはコンパイルされますが、これは:
template <typename K, typename V> friend void Tree<K, V>::del(NodeP);
... しません。お互いのインスタンスに依存しすぎているのではないかと思っていますか? 私がやりたいことをする方法はありますか?ありがとう。