Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Memerlukan Parameter Berasingan untuk Kelas Templat Rakan Di Dalam Templat Kelas?

Mengapa Saya Memerlukan Parameter Berasingan untuk Kelas Templat Rakan Di Dalam Templat Kelas?

Barbara Streisand
Barbara Streisandasal
2024-11-17 18:40:02273semak imbas

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

Templat Kelas dengan Templat Rakan Kelas: Mempelajari Mekanik

Bayangkan membina kelas pokok binari (BT) dengan kelas elemen (BE ) menerangkan setiap nod, menyerupai struktur berikut:

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

Persediaan ini menghadapi sifat ingin tahu. Percubaan untuk mengisytiharkan rakan sebagai templat kawan kelas BT; gagal, memerlukan penggunaan parameter U yang berasingan (atau mana-mana parameter bukan T).

Perbezaan ini berpunca daripada konsep pembayang templat. Parameter templat tidak boleh menduplikasi antara satu sama lain dalam skop templat bersarang. Akibatnya, nama parameter yang berbeza amat diperlukan untuk templat bersarang.

Pertimbangkan binaan berikut:

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

Di sini, bar diisytiharkan sebagai rakan untuk menipu tanpa mengira hujah templatnya sendiri. Semua variasi bar, sama ada bar, bar, bar, atau lain-lain, menjadi kawan kepada mana-mana instantiasi foo.

Sebaliknya, pengisytiharan berikut:

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

Menyiratkan bahawa bar hanyalah rakan untuk ditipu apabila hujah templat bar sejajar dengan foo's. Hanya bar akan dianggap sebagai rakan untuk menipu.

Oleh itu, dalam senario tertentu anda, menggunakan bar kelas rakan tingkatan; harus mewujudkan perhubungan rakan yang diingini dengan berkesan antara BE dan BT.

Atas ialah kandungan terperinci Mengapa Saya Memerlukan Parameter Berasingan untuk Kelas Templat Rakan Di Dalam Templat Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn