2016-05-12 4 views
2

私はNodeクラスのwhiceがNode型の要素を含むBinaryTreeクラスのフレンドです。私はどのタイプのBinareTreeを作成したいので、私は両方のクラスでテンプレートを使用しています。このコードのように:クラステンプレートとフレンドクラス

私はそれをテンプレートとして使用する場合、私は友人のクラスBinaryTreeの宣言であなたに必要なのは何な構文
template <class T> 
class Node 
{ 
    T value; 
    Node<T> *left, *right; 
    friend template <typename T> class BinaryTree; // here is the problem 
}; 
template <class Y> 
class BinaryTree{...}; 

BinareTree<int> tree; 

は私が考え、この任意のより良い方法があります: 私の目標は、書くことができるようにするのですか? ありがとう!

+0

は、覚えておいてください「友人」を使うときに最初に質問するのは、「友人」を使う必要が本当にありますか? – Kupiakos

+0

@ Kupiakos [友人関係をリファクタリングする方法]がありますが(http://stackoverflow.com/questions/27492132/how-can-i-remove-refactor-a-friend-dependency-declaration-properly)それは時には(例えばプラグマティズムのために)理にかなっています。あなたがしていることをよく知っていれば、単に「友人」を使うだけです。 –

+0

@ Kupiakosはい、私はBinaryTreeクラスのNodeクラスのプライベートメンバーにアクセスしたいからです。 – Copacel

答えて

4

あなたがtemplate friendsのための構文を検索した場合、あなたはそれを行うための正しい方法を見つけることができます:

class A { 
    template<typename T> 
    friend class B; // every B<T> is a friend of A 

    template<typename T> 
    friend void f(T) {} // every f<T> is a friend of A 
}; 

あなたはおそらくただの友達に特定のものにしたいが:

friend class BinaryTree<T>; 
+0

''クラスA 'がテンプレートクラスそのものであるとき、[http://coliru.stacked-crooked.com/a/0495156f9adb8f27]異なるテンプレートパラメータ名が必要であることに注意してください。 –

関連する問題