Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengakses Pembolehubah Diwarisi Dilindungi dalam Kelas Induk Templat dalam C?
Mengakses Pembolehubah Dilindungi Diwarisi dalam Kelas Induk Templat
Isu timbul apabila cuba mengakses pembolehubah diwarisi yang dilindungi daripada kelas induk templat dalam C . Pertimbangkan kod C berikut:
template<class T> class Foo { protected: int a; }; template<class T> class Bar : public Foo<T> { protected: int b; }; template<class T> int Bar<T>::Perna(int u) { int c = Foo<T>::a * 4; // This works return (a + b) * u; // This doesn't }
Dalam kes ini, GCC versi 3.4.6 dan lebih baharu menimbulkan ralat apabila cuba mengakses pembolehubah dilindungi a kelas Foo yang diwarisi. Penyusun lama, termasuk GCC 2.96 dan MSVC 6-9, membenarkan akses ini tanpa isu.
Penjelasan Ralat
Ralat berlaku kerana, menurut piawaian C, tidak layak nama dalam templat mesti dicari semasa definisi templat. Walau bagaimanapun, takrif kelas asas bergantung (seperti Foo dalam kes ini) mungkin tidak diketahui pada masa definisi templat. Ketidakpastian ini menghalang penyelesaian nama yang tidak layak.
Pematuhan Standard
Tingkah laku yang ditunjukkan oleh GCC 3.4.6 dan versi yang lebih baru adalah mematuhi piawaian C. Dengan mematuhi piawaian, penyusun ini memastikan ketepatan dan tingkah laku kod adalah konsisten merentas platform dan penyusun yang berbeza.
Resolusi
Untuk menyelesaikan isu ini dan mengakses warisan yang dilindungi pembolehubah, seseorang boleh sama ada menggunakan nama pembolehubah yang layak (cth., Foo
template<class T> int Bar<T>::Perna(int u) { int c = this->a * 4; // Access using the qualified name c = a * 4; // Access using the "using" declaration }
Dalam kod yang diubah suai ini, nama yang layak atau pengisytiharan "menggunakan" secara eksplisit menyatakan sumber pembolehubah, membenarkan pengkompil menyelesaikannya dengan betul.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Pembolehubah Diwarisi Dilindungi dalam Kelas Induk Templat dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!