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