ホームページ >バックエンド開発 >C++ >クラス テンプレート内のフレンド テンプレート クラスに別のパラメータが必要なのはなぜですか?

クラス テンプレート内のフレンド テンプレート クラスに別のパラメータが必要なのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-17 18:40:02276ブラウズ

Why Do I Need a Separate Parameter for a Friend Template Class Inside a Class Template?

クラス テンプレートとテンプレート クラスの友人: メカニズムの詳細

要素クラス (BE) を使用して二分木 (BT) クラスを構築することを想像してください。 ) 各ノードを説明し、次の構造に似ています:

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:
    ...
};

このセットアップでは、奇妙な癖。友人をテンプレートとして宣言しようとしています。フレンドクラスBT。これは失敗するため、別のパラメータ U (または T 以外のパラメータ) を使用する必要があります。

この区別は、テンプレート シャドウイングの概念に由来します。テンプレート パラメーターは、ネストされたテンプレートの範囲内で相互に重複することはできません。したがって、ネストされたテンプレートには異なるパラメータ名が不可欠です。

次の構造を考えてみましょう:

template<typename T>
struct foo {
  template<typename U>
  friend class bar;
};

ここでは、bar は、それ自体のテンプレート引数に関係なく、foo のフレンドとして宣言されています。 bar、bar、bar など、bar のすべてのバリエーションは、foo のインスタンス化と友達になります。

対照的に、次の宣言は:

template<typename T>
struct foo {
  friend class bar<T>;
};

bar のテンプレート引数が一致する場合、bar は foo の友人にすぎないことを意味しますフーズと一緒に。 bar のみ

したがって、特定のシナリオでは、フレンドクラスバー; の形式を採用します。 BE と BT の間に望ましい友人関係を効果的に確立する必要があります。

以上がクラス テンプレート内のフレンド テンプレート クラスに別のパラメータが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。