Pengecam Kelas Templat Asas yang Tidak Boleh Dicapai dalam Kelas Terbitan: Kes Carian Dua Fasa
Apabila bekerja dengan kelas templat, adalah penting untuk memahami implikasi carian dua fasa. Dalam C , pengecam dalam definisi kelas templat tidak diselesaikan sepenuhnya semasa penyusunan. Sebaliknya, ia diselesaikan semasa instantiasi templat berdasarkan hujah jenis sebenar yang disediakan. Ini boleh membawa kepada situasi di mana kelas templat terbitan tidak boleh mengakses pengecam secara langsung daripada kelas templat asasnya.
Pertimbangkan contoh 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 kod ini, kelas Templat Terbitan diwarisi daripada kelas templat asas. Walau bagaimanapun, apabila menyusun kod ini, ralat berlaku kerana kelas Terbitan cuba menggunakan pengecam NO_ZEROFILL daripada kelas Asas tanpa melayakkannya dengan nama kelas asas.
Tingkah laku ini disebabkan oleh carian dua fasa. Semasa fasa pertama penyusunan, pengkompil memproses definisi templat tanpa menggantikan sebarang argumen jenis sebenar untuk T. Akibatnya, pengkompil tidak dapat menentukan kewujudan pengecam khusus dalam Base
Untuk menyelesaikan isu ini, anda mesti menyatakan secara eksplisit nama kelas asas apabila mengakses pengecam daripada kelas templat asas. Ini boleh dilakukan menggunakan Base
Atas ialah kandungan terperinci Mengapa Kelas Templat Terbitan Tidak Boleh Mengakses Terus Pengecam daripada Kelas Templat Asas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!