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 的其他成员函数)声明为friendNode 类的一个。我试过friend用这条线把整个班级变成 a :

template <typename K, typename V> friend class Tree;

编译,但是这个:

template <typename K, typename V> friend void Tree<K, V>::del(NodeP);

……没有。我想知道我是否让它们过于依赖彼此的实例?有没有办法做我想做的事?谢谢。

4

0 回答 0