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!