物語「C ++入門」16.4の第3版をよると、C ++テンプレートのフレンドクラスには、次のような状況に分けて
1.非テンプレートフレンドクラスまたは友人の機能。本の中で与えられた一つの例:
class Foo
{
void bar();
};
template <class T>
class QueueItem
{
friend class foobar;
friend void foo();
friend void Foo::bar();
//....
};
私たちは通常の関数と宣言または定義されていない前述の必要性の友人のクラス宣言をしたい場合は、以下の点を注意してください。私たちは、クラスのメンバ関数はフレンドとして宣言されたい場合は、それはクラスのメンバとして(注意文が定義されていない)クラスの定義が先行しなければならないだけで、クラスの定義によって導入することができます。
2.バインドされた友人のクラスまたは関数テンプレート。例としては、次のとおりです:
template <class Type>
class foobar{ ...};
template <class Type>
void foo(QueueItem<Type>);
template <class Type>
class Queue
{
void bar();
//...
};
template <class Type>
class QueueItem
{
friend class foobar<Type>;
friend void foo<Type>(QueueItem<Type>);
friend void Queue<Type>::bar();
//...
};
次の2点に注意してください。
。非テンプレート関数やクラスで、テンプレート関数やクラス宣言は、以前のように友人の前で宣言されなければならない、またはコンパイルすることはできません。
自分の名前の後に友人としてテンプレートクラスまたは関数の宣言は、タイプを追加する場合は、B。、それ以外の場合はエラーをコンパイルします。増加していない場合たとえば、通常の関数fooのために、コンパイラは、非テンプレート関数、として扱いますQueueItemボイドのfoo(QueueItem)のコンパイラルックス、テンプレート<クラスタイプ>中のボイドのfoo(のための QueueItem < タイプ>)が非テンプレート機能を見つけられない場合、コンパイラはエラーを報告します、盲目の目を回します。
3.非結合友人クラスまたは関数テンプレート。たとえば、次のように:
template <class Type>
class QueueItem
{
template <class T>
friend class foobar;
template <class T>
friend void foo(QueueItem<T>);
template <class T>
friend void Queue<T>::bar();
//...
};