1

テンプレートクラスのペアで構成されたツリーがあり、そのうちの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 クラスの として宣言する方法です。次の行で、クラス全体を a にしようとしましたfriend

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

それはコンパイルされますが、これは:

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

... しません。お互いのインスタンスに依存しすぎているのではないかと思っていますか? 私がやりたいことをする方法はありますか?ありがとう。

4

0 に答える 0