Dalam C , apabila kelas templat terbitan mewarisi daripada kelas templat asas, adalah wajar untuk mengharapkan kelas terbitan untuk mempunyai akses kepada pengecam kelas asas. Walau bagaimanapun, dalam senario tertentu, anda mungkin menghadapi situasi di mana akses ini dihadkan.
Pertimbangkan 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(); };
Dalam contoh ini, kelas Derived tidak boleh mengakses pengecam NO_ZEROFILL yang ditakrifkan dalam kelas Asas. Tingkah laku ini disebabkan oleh mekanisme carian dua fasa dalam C .
Semasa pengembangan templat, templat kelas asas dijadikan instantiated dengan jenis khusus untuk T. Dalam kes ini, pengkompil tidak mengetahui jenis sebenar T sehingga templat digunakan. Oleh itu, ia tidak dapat menyelesaikan pengecam dalam kelas asas yang bergantung pada T, seperti NO_ZEROFILL.
Untuk menangani isu ini, anda mesti menyatakan secara eksplisit templat kelas asas apabila mengakses pengecamnya. Sebagai contoh, anda perlu menulis Derived
Spesifikasi templat kelas asas eksplisit ini mengarahkan pengkompil untuk mencari pengecam NO_ZEROFILL dalam konteks Derived
Atas ialah kandungan terperinci Mengapa Kelas Templat Terbitan Tidak Boleh Mengakses Pengecam Kelas Templat Asas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!