Mengapa Kelas Templat Terbitan Tidak Boleh Mengakses Pengecam Kelas Templat Asas Secara Terus?

DDD
Lepaskan: 2024-11-16 03:01:02
asal
824 orang telah melayarinya

Why Can't Derived Template Classes Access Base Template Class Identifiers Directly?

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();
}
Salin selepas log masuk

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 dan memerlukan mereka layak secara eksplisit dengan nama kelas asas.

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 mempunyai set ahli statiknya sendiri "ZEROFILL" dan "NO_ZEROFILL", dan pengkompil hanya akan mengesahkan kesahihan kod apabila templat diwujudkan dengan hujah jenis tertentu.

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 );
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan