C では、クラスを他のクラスのフレンドとして定義し、カプセル化に関係なくプライベート メンバーへのアクセスを許可することができます。 。ただし、クラス テンプレートを扱う場合、基礎となる友人関係を理解することが重要になります。
コード例を考えてみましょう。
template<class T> class BE { T *data; BE *l, *r; public: template<class U> friend class BT; }; template<class T> class BT { BE<T> *root; public: ... private: ... };
このコードは、ツリー要素を表すクラス BE と、ツリー要素を表すクラス BT を定義します。二分木。当初、フレンド クラスを
template<class T> friend class BT;
として宣言しようとしましたが、このアプローチは失敗しました。その理由を理解するには、テンプレート パラメーターが相互にシャドウし合うことができないことを認識することが不可欠です。ネストされたテンプレートでは、各レベルに一意のテンプレート パラメーター名が必要です。
対照的に、次の宣言を考えてみましょう。
template<class T> class BE { template<class U> friend class BT<U>; };
これは、BT のテンプレート引数に関係なく、BT が BE の友達であることを示します。 BT のすべてのインスタンスは、格納されている型に関係なく、BE のフレンドになります。
または、次の宣言が使用される場合:
template<class T> class BE { friend class BT<T>; };
これは、BT が単なるBT のテンプレート引数が BE と一致する場合、BE の友人。この場合、例えば、BT
バイナリ ツリーの例の場合、フレンド クラスをフレンド クラス BT
以上がC でクラス テンプレートをフレンドとして宣言するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。