1. ホーム
  2. c++

[解決済み] クラステンプレートとテンプレートクラスの友人、本当はどうなっているのか?

2023-04-22 03:04:07

質問

例えば、2分木のクラスを作成するとします。 BT という二分木のクラスを作成し、その木の要素を記述するクラスがあるとします。 BE のようなものです。

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

これは動作しているように見えます。しかし、その下で何が起こっているのかについて疑問があります。

私はもともとフレンドを

template<class T> friend class BT;

を使用する必要があるようです。 U (あるいは T を使うのはなぜでしょうか?それは、ある特定の BT が特定の BE クラスと友達ですか?

テンプレートと友人に関するIBMのページには、関数のための異なるタイプの友人関係の例がありますが、クラスはありません(そして、構文はまだ解決策に収束していないと推測されます)。私は、定義したいタイプの友人関係に対して正しい仕様を取得する方法を理解することを希望します。

どのように解決するのですか?

template<class T> class BE{
  template<class T> friend class BT;
};

テンプレート・パラメータは互いにシャドウできないため、許可されません。ネストされたテンプレートは異なるテンプレートパラメータ名でなければなりません。


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

これはつまり bar の友人であり foo とは関係なく bar のテンプレート引数に関係なく bar<char> , bar<int> , bar<float> そして、その他の bar の友人となる。 foo<char> .


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

これはつまり bar の友人であり foo というのは bar のテンプレート引数が foo 's. のみ bar<char> の友人となるのは foo<char> .


あなたの場合 friend class bar<T>; で十分でしょう。