バイナリ ツリー (BT) とツリー内の要素 (BE) のクラス テンプレートを定義するシナリオを考えてみましょう。これらのクラス間のフレンドシップを宣言する場合、フレンド クラスには、それを含むクラスとは異なるテンプレート パラメーターを使用する必要があるのはなぜですか?
C では、テンプレート パラメーターは相互にシャドウできません。ネストされたテンプレートのコンテキストでは、内側のテンプレートのテンプレート パラメーターは、外側のテンプレートのテンプレート パラメーターとは異なる名前を持つ必要があります。
たとえば、次のコードでは:
template<class T> class BE { T *data; BE *l, *r; public: template<class U> friend class BT; };
フレンドクラス BT のテンプレート パラメータ U は、BE クラスのテンプレート パラメータ T と区別するために使用されます。これは、BT のテンプレート引数に関係なく、BT が BE のフレンドであることを指定します。
ただし、フレンド クラスを次のように宣言すると、
template<class T> friend class BT;
これは、BT の特定のインスタンス化がすべてであることを意味します。 BE の特定のインスタンス化のフレンド。より具体的な友情を指定するには、次の構文を使用できます。
template<typename T> struct foo { friend class bar<T>; };
これは、bar のテンプレート引数が foo のテンプレート引数と一致する場合にのみ、bar が foo の友人であることを示します。あなたの場合、フレンドクラスバー
以上がネストされたテンプレートのフレンド クラスに異なるテンプレート パラメーターを使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。