Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya Boleh Mengakses Typedefs Kelas Asas dalam Templat Kelas Terbitan dalam C?

Bagaimanakah saya Boleh Mengakses Typedefs Kelas Asas dalam Templat Kelas Terbitan dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-19 12:52:09959semak imbas

How Can I Access Base Class Typedefs in Derived Class Templates in C  ?

Templat Typedefs untuk Kelas Terbitan

Dalam C , templat membenarkan mentakrifkan kelas generik dan struktur data. Walau bagaimanapun, penyebaran typedef daripada kelas asas kepada kelas terbitan memerlukan pengendalian khusus.

Pertimbangkan kod berikut:

template<typename T>
class A {
public:
    typedef std::vector<T> Vec_t;
};

template<typename T>
class B : public A<T> {
private:
    Vec_t v; // Error: Vec_t is not recognized
};

Dalam contoh ini, kelas A mentakrifkan typedef untuk vektor jenis T. Walau bagaimanapun , apabila cuba menggunakan typedef ini dalam kelas terbitan B, ralat berlaku kerana Vec_t tidak dikenali dalam B skop.

Punca isu ini berpunca daripada perlakuan C Standard terhadap skop kelas asas untuk templat. Menurut Seksyen 14.6.2/3 Standard:

"Dalam takrif templat kelas atau ahli templat kelas, jika kelas asas templat kelas bergantung pada parameter templat, skop kelas asas tidak diperiksa semasa carian nama tidak layak..."

Ini bermakna typedef yang ditakrifkan dalam kelas asas tidak tersedia secara automatik dalam skop kelas terbitan apabila menggunakan nama yang tidak layak. Untuk menyelesaikan isu ini, typedef mestilah berkelayakan sepenuhnya:

typename A<T>::Vec_t v;

Dengan menggunakan kata kunci typename diikuti dengan nama typedef yang layak sepenuhnya, anda dengan jelas menyatakan bahawa anda ingin menggunakan typedef dari kelas asas . Ini akan berfungsi seperti yang diharapkan dan membolehkan anda mengakses vektor typedef dalam kelas terbitan.

Atas ialah kandungan terperinci Bagaimanakah saya Boleh Mengakses Typedefs Kelas Asas dalam Templat Kelas 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