Keterlihatan Pengecam Kelas Templat Asas dalam Kelas Templat Terbitan
Pertimbangkan coretan kod berikut:
template<typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; }; template<typename T> class Derived : public Base<T> { public: Derived(bool initZero = NO_ZEROFILL); // NO_ZEROFILL is not visible ~Derived(); };
Apabila disusun dengan GCC g 3.4.4 (cygwin), penyusunan kod ini gagal kerana NO_ZEROFILL tidak kelihatan kepada kelas templat Derived. Tingkah laku ini boleh dikaitkan dengan carian dua fasa dalam C .
Pencarian Dua Fasa dalam C
Apabila pengkompil menemui pengisytiharan templat, ia hanya melakukan pendahuluan cari pengecam yang digunakan dalam templat itu. Memandangkan jenis sebenar untuk T tidak ditentukan pada peringkat ini, pengkompil tidak boleh menyelesaikan pengecam yang bergantung pada jenis ini, seperti Base
Dalam carian dua fasa proses:
Dalam kes ini, NO_ZEROFILL tidak kelihatan semasa carian awal kerana ia bergantung pada jenis yang tidak diketahui T. Akibatnya, anda mesti menyatakan secara eksplisit Base
Atas ialah kandungan terperinci Mengapakah Ahli Statik Kelas Templat Asas Tidak Boleh Dicapai dalam Kelas Terbitan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!