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

Mengapakah Ahli Statik Kelas Templat Asas Tidak Boleh Dicapai dalam Kelas Terbitan?

Patricia Arquette
Patricia Arquetteasal
2024-11-18 00:34:02647semak imbas

Why are Static Members of Base Template Classes Inaccessible in Derived Classes?

Keterlihatan Pengecam Kelas Templat Asas dalam Kelas Templat Terbitan

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();
};

Apabila disusun dengan GCC g 3.4.4 (cygwin), penyusunan kod ini gagal kerana NO_ZEROFILL tidak kelihatan kepada kelas templat Derived. Tingkah laku ini boleh dikaitkan dengan carian dua fasa dalam C .

Pencarian Dua Fasa dalam C

Apabila pengkompil menemui pengisytiharan templat, ia hanya melakukan pendahuluan cari pengecam yang digunakan dalam templat itu. Memandangkan jenis sebenar untuk T tidak ditentukan pada peringkat ini, pengkompil tidak boleh menyelesaikan pengecam yang bergantung pada jenis ini, seperti Base::NO_ZEROFILL.

Dalam carian dua fasa proses:

  1. Pencarian awal: Pengecam dicari dalam skop semasa dan dalam ruang nama yang diisytiharkan sebelum ini.
  2. Penetapan templat: Sekali templat dijadikan instantiated dengan parameter jenis tertentu, carian kedua dilakukan untuk mencari ahli instantiated dan pengecam.

Dalam kes ini, NO_ZEROFILL tidak kelihatan semasa carian awal kerana ia bergantung pada jenis yang tidak diketahui T. Akibatnya, anda mesti menyatakan secara eksplisit Base::NO_ZEROFILL atau ini->NO_ZEROFILL dalam kelas terbitan untuk menunjukkan bahawa ia adalah ahli kelas asas yang jenisnya ditentukan pada masa instantiasi templat.

Atas ialah kandungan terperinci Mengapakah Ahli Statik Kelas Templat Asas Tidak Boleh Dicapai dalam Kelas Terbitan?. 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