2012-03-13 8 views
2

2つのクラステンプレートAとB、および関数テンプレートf1()があります。このように:クラステンプレートの友人に関するいくつかの問題

template< class T > 
class A{}; 

template< class T > 
class B 
{ 
    friend class A<T>;   /* Expression 1 */ 
    friend void f1(B<T> &b); /* Expression 2 */ 
}; 

template< class T > 
void f1(B<T> &b) {} 

int main() 
{ 
    A<int> a; 
    B<int> b; 

    f1(b); 

    return 0; 
} 

問題1:式1引数T友人引数TとBの専門の しかし、どのように専門のすべての友人のすべての 専門を作ることでの専門を作りますBの?

問題2: f1をクラス定義の外に定義する方法は?

undefined reference to `f1(B<int>&)' 

問題3:すべてのF1()S(誰が引数としてBのすべての専門を受け取ることができます)Bのすべての専門の 友達を作るためにどのようにこのような コードは、エラーを生成しますか?

答えて

2

問題1:2の

あなたは本当にそれをしたいですか? A<int>B<float>にアクセスしますか?通常はありませんが、あなたが本当にしたい場合:

template <typename U> 
friend class A; 

問題2:

2の問題は、あなたがf1テンプレート友人のインスタンス化を行っていないのではなく、あなたがしようとしているということですテンプレート化されていない無料の機能をf1に作成するには、B<int>が必要です。特定のインスタンスを仲良くなるための正しい構文は面倒です:

template <typename T> class B; 
template <typename T> void f(B<T>&); 
template <typename T> 
class B { 
    friend void f<T>(B<T>&); 
}; 

問題3:(?もう一度、あなたが本当にこれをしたいですか)

f1のすべての専門友人が作成するには、同じアプローチを行うことができますクラステンプレートのよう:

template <typename U> 
friend void f1(B<U>&); 

これらすべてのhere

+0

「テンプレート友人Aクラス」と「テンプレート友人Aクラス」の違いは何ですか?わかりません。@David Rodriguez –

+0

@UniMouS:あなたが編集を意味するなら、タイプミスを修正する(私は思う)。これは私がほとんど書いていないものの一つであり、その構文はそれほど単純ではありません。私がかなり前に書いたもう一つの答えを、私がコンパイラで検証し、 –

+0

あなたの答えをありがとう、私はC++の初心者です。私はその構文をあまり理解していません。 @David Rodriguez –

3

問題1:友人にB、ない関数テンプレートの特殊化を取って正常な機能をどのような式2を宣言しているん:代わりに

friend class A<T>; 

問題2の

template <typename U> friend class A; 

を使用しています。友人にTのために特殊化を宣言するために、あなたはF1をマークするために、F1の宣言を参照して<>を追加する友人句を必要とするので、

template< class T > 
class B; 
template< class T > 
void f1(B<T> &b); 
template< class T > 
class B 
{ 
    friend void f1<>(B<T> &b); 
}; 

template< class T > 
void f1(B<T> &b) {} 

問題3解決策がミックスされ、専門ではなく、オーバーロード正常な機能です

class B; 
template< class T > 
void f1(B<T> &b); 
template< class T > 
class B 
{ 
    template <typename U> friend void f1(B<U> &b); 
}; 
+0

グレート答え、私から+10の詳細! –

関連する問題