Rumah >pembangunan bahagian belakang >C++ >Mengapakah Pengecam Kelas Asas Tidak Boleh Dicapai dalam Kelas Templat Terbitan dalam C?
Keterlihatan Pengecam Terhad dalam Kelas Templat Terbitan
Dalam C , kelas templat memperkenalkan aspek unik dalam warisan: pengecam yang ditakrifkan dalam kelas templat asas mungkin tidak kelihatan kepada kelas templat terbitan. Tingkah laku ini, yang dikenali sebagai carian dua fasa, timbul disebabkan oleh peringkat berbeza yang terlibat dalam instansiasi dan penyusunan templat.
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(); };
Semasa menyusun kod ini, GCC g 3.4.4 (cygwin) menghasilkan ralat, kerana Derived tidak boleh mengakses NO_ZEROFILL daripada Base kelas asasnya. Ini kerana semasa fasa pertama instantiasi templat, apabila pengkompil menghuraikan kod, ia tidak mempunyai jenis konkrit yang diberikan kepada T. Akibatnya, ia tidak dapat menentukan kelas Asas tertentu yang Terbit diwarisi dan oleh itu tidak dapat menyelesaikan pengecam yang ditakrifkan. dalam kelas asas.
Untuk mengatasi had ini, kelayakan eksplisit diperlukan apabila mengakses pengecam kelas asas dalam kelas templat terbitan. Kod di bawah menangani isu:
template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = Base<T>::NO_ZEROFILL); // Explicit qualification ~Derived(); };
Dengan menggunakan Base
Oleh itu, dalam kelas templat terbitan, pengecam yang ditakrifkan dalam kelas templat asas hanyalah boleh diakses dengan kelayakan yang jelas, memastikan peleraian yang betul pada masa jalan apabila templat digunakan dengan jenis tertentu.
Atas ialah kandungan terperinci Mengapakah Pengecam Kelas Asas Tidak Boleh Dicapai dalam Kelas Templat Terbitan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!