我有一棵由一对模板类组成的树,其中一个需要访问另一个的私有成员,最好仅限于那些实际需要访问的成员函数。这是我的课程的简化插图:
// 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 类的一个。我试过friend
用这条线把整个班级变成 a :
template <typename K, typename V> friend class Tree;
编译,但是这个:
template <typename K, typename V> friend void Tree<K, V>::del(NodeP);
……没有。我想知道我是否让它们过于依赖彼此的实例?有没有办法做我想做的事?谢谢。