C++クラステンプレートと友元の関係
2129 ワード
まとめてみると、いくつかあります.クラステンプレートに非テンプレート友元が含まれている場合、友元はすべてのクラステンプレートインスタンスにアクセスすることを許可されます. 非テンプレートクラスにテンプレート友元が含まれている場合、すべての友元インスタンスはクラスにアクセスすることを許可されます. クラステンプレートが友元テンプレートと同じタイプのパラメータを持っている場合、クラスと友元は1対1の友好関係になります. クラステンプレートと友元テンプレートが異なるタイプのパラメータを持っている場合、クラスの各インスタンスはすべてのテンプレートインスタンスに許可されます.
一対一の友好関係
クラステンプレートと別の(クラスまたは関数)テンプレートとの友好関係の最も一般的な形式は、対応するインスタンスとその友元間の友好関係を確立することである.たとえば、Blobクラスは、BlobPtrクラスとテンプレートバージョンのBlob等しい演算子を友元として定義します.
(クラスまたはテンプレート)の特定のインスタンスを参照するには、テンプレート自体を宣言する必要があります.テンプレート宣言には、テンプレートパラメータのリストが含まれます.
友元の宣言は、Blobテンプレートパラメータを独自のテンプレートインスタンスとして使用するため、友元関係は、同じタイプのインスタンス化されたBlobとBlobPtrの等しい演算子との間に限定される.
一般クラスと友元テンプレート
クラステンプレートと一般友元
クラステンプレートと友元テンプレート(多対多関係)
テンプレート独自のタイプパラメータを友元にする
新しい基準では、テンプレートタイプパラメータを友元として宣言できます.
ここではBarのタイプをインスタンス化するために友元として宣言します.したがって、あるタイプの名前Fooに対して、FooはBarの友元になります.
一対一の友好関係
クラステンプレートと別の(クラスまたは関数)テンプレートとの友好関係の最も一般的な形式は、対応するインスタンスとその友元間の友好関係を確立することである.たとえば、Blobクラスは、BlobPtrクラスとテンプレートバージョンのBlob等しい演算子を友元として定義します.
(クラスまたはテンプレート)の特定のインスタンスを参照するには、テンプレート自体を宣言する必要があります.テンプレート宣言には、テンプレートパラメータのリストが含まれます.
// , Blob
template class BlobPtr;
template class Blob; // ==
template
bool operator==(const Blob&, const Blob&);
template
class Blob {
// Blob BlobPtr
friend class BlobPtr;
friend bool operator==(const Blob&, const Blob&);
};
友元の宣言は、Blobテンプレートパラメータを独自のテンプレートインスタンスとして使用するため、友元関係は、同じタイプのインスタンス化されたBlobとBlobPtrの等しい演算子との間に限定される.
Blob ca; //BlobPtr operator==
Blob ia; //BlobPtr operator==
一般クラスと友元テンプレート
class C {
friend class Pal; // C Pal C
//Pal1 C ,
template friend class Pal1;
};
クラステンプレートと一般友元
template
class C2 {
//Pal2 , C2 ,
friend class Pal2;
};
クラステンプレートと友元テンプレート(多対多関係)
template
class C2 {
//Pal3 C2 ,
template friend class Pal3;
};
テンプレート独自のタイプパラメータを友元にする
新しい基準では、テンプレートタイプパラメータを友元として宣言できます.
template class Bar {
friend Type; // Bar
};
ここではBarのタイプをインスタンス化するために友元として宣言します.したがって、あるタイプの名前Fooに対して、FooはBarの友元になります.