Rumah >pembangunan bahagian belakang >C++ >Mengapa Kelas Templat Terbitan Tidak Boleh Mengakses Terus Pengecam daripada Kelas Templat Asas?

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

Barbara Streisand
Barbara Streisandasal
2024-11-17 02:46:03921semak imbas

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

Pengecam Kelas Templat Asas yang Tidak Boleh Dicapai dalam Kelas Terbitan: Kes Carian Dua Fasa

Apabila bekerja dengan kelas templat, adalah penting untuk memahami implikasi carian dua fasa. Dalam C , pengecam dalam definisi kelas templat tidak diselesaikan sepenuhnya semasa penyusunan. Sebaliknya, ia diselesaikan semasa instantiasi templat berdasarkan hujah jenis sebenar yang disediakan. Ini boleh membawa kepada situasi di mana kelas templat terbitan tidak boleh mengakses pengecam secara langsung daripada kelas templat asasnya.

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

Dalam kod ini, kelas Templat Terbitan diwarisi daripada kelas templat asas. Walau bagaimanapun, apabila menyusun kod ini, ralat berlaku kerana kelas Terbitan cuba menggunakan pengecam NO_ZEROFILL daripada kelas Asas tanpa melayakkannya dengan nama kelas asas.

Tingkah laku ini disebabkan oleh carian dua fasa. Semasa fasa pertama penyusunan, pengkompil memproses definisi templat tanpa menggantikan sebarang argumen jenis sebenar untuk T. Akibatnya, pengkompil tidak dapat menentukan kewujudan pengecam khusus dalam Base. Hanya semasa fasa kedua, apabila templat digunakan untuk jenis tertentu (cth., Derived), boleh pengkompil menyelesaikan pengecam dan mengesahkan kewujudannya.

Untuk menyelesaikan isu ini, anda mesti menyatakan secara eksplisit nama kelas asas apabila mengakses pengecam daripada kelas templat asas. Ini boleh dilakukan menggunakan Base::NO_ZEROFILL atau ini->NO_ZEROFILL, di mana ini merujuk kepada contoh kelas Terbitan. Dengan berbuat demikian, anda memaklumkan pengkompil bahawa pengecam ditakrifkan dalam kelas asas dan harus diselesaikan semasa instantiasi templat.

Atas ialah kandungan terperinci Mengapa Kelas Templat Terbitan Tidak Boleh Mengakses Terus Pengecam daripada Kelas Templat Asas?. 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