Rumah >pembangunan bahagian belakang >C++ >Mengapakah Pengecam Kelas Asas Tidak Boleh Dicapai dalam Kelas Templat Terbitan dalam C?

Mengapakah Pengecam Kelas Asas Tidak Boleh Dicapai dalam Kelas Templat Terbitan dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-11-19 00:10:02407semak imbas

Why Are Base Class Identifiers Inaccessible in Derived Template Classes in 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::NO_ZEROFILL, pengkompil secara jelas diarahkan untuk mencari pengecam dalam kelas asas, walaupun jenis konkrit T tidak diketahui pada peringkat ini.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn