C++クラステンプレートと友元の関係

2129 ワード

まとめてみると、いくつかあります.
  • クラステンプレートに非テンプレート友元が含まれている場合、友元はすべてのクラステンプレートインスタンスにアクセスすることを許可されます.
  • 非テンプレートクラスにテンプレート友元が含まれている場合、すべての友元インスタンスはクラスにアクセスすることを許可されます.
  • クラステンプレートが友元テンプレートと同じタイプのパラメータを持っている場合、クラスと友元は1対1の友好関係になります.
  • クラステンプレートと友元テンプレートが異なるタイプのパラメータを持っている場合、クラスの各インスタンスはすべてのテンプレートインスタンスに許可されます.

  • 一対一の友好関係
    クラステンプレートと別の(クラスまたは関数)テンプレートとの友好関係の最も一般的な形式は、対応するインスタンスとその友元間の友好関係を確立することである.たとえば、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の友元になります.