Mengapa Kelas Templat Terbitan Kehilangan Akses kepada Pengecam Kelas Templat Asas
Dalam C , kelas templat terbitan mungkin tidak mempunyai akses terus kepada pengecam kelas templat asasnya. Tingkah laku ini, yang dikenali sebagai carian dua fasa, dikuatkuasakan oleh spesifikasi C.
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(); }
Dalam contoh ini, kelas terbitan Derived tidak boleh mengakses secara langsung NO_ZEROFILL pengecam daripada Base kelas asasnya. Ini kerana, semasa fasa definisi templat, pengkompil tidak mempunyai jenis sebenar yang digantikan untuk T. Oleh itu, ia tidak dapat menyelesaikan pengecam yang ditakrifkan dalam Base
Tingkah laku ini memastikan bahawa maksud pengecam dalam kelas templat ditakrifkan dengan baik walaupun apabila kelas dijadikan instantiated dengan jenis yang berbeza. Setiap instantiasi Base
Untuk menyelesaikan isu dalam kod yang disediakan, anda boleh melayakkan pengecam NO_ZEROFILL secara eksplisit dengan nama kelas asas, seperti yang dilihat di bawah:
Derived( bool initZero = Base<T>::NO_ZEROFILL );
Atas ialah kandungan terperinci Mengapa Kelas Templat Terbitan Tidak Boleh Mengakses Pengecam Kelas Templat Asas Secara Terus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!