Isu Penyusunan GCC: Kebolehcapaian Ahli Kelas Asas dalam Kelas Templat
Apabila menyusun hierarki kelas templat, GCC kadangkala menghadapi ralat yang tidak timbul dalam penyusun lain. Satu ralat sedemikian berlaku apabila cuba mengakses ahli kelas asas yang bergantung pada hujah templat.
Pertimbangkan coretan kod berikut:
<code class="cpp">template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } // Error in GCC };
Menyusun kod ini dengan GCC menghasilkan ralat :
error: ‘foo’ was not declared in this scope
Walaupun wujud logik ahli foo dalam kelas asas, GCC gagal mengenalinya tanpa menyatakan kelas asas secara eksplisit atau menggunakan penuding ini. Percanggahan ini berpunca daripada versi terdahulu spesifikasi C, yang membenarkan inferens ahli kelas asas melalui penghuraian. Walau bagaimanapun, kemas kini berikutnya pada spesifikasi menjelaskan bahawa inferens sedemikian boleh membawa kepada konflik.
Untuk menyelesaikan isu ini, terdapat dua pendekatan yang disyorkan:
<code class="cpp">void bar() { cout << this->foo << endl; }</code>
<code class="cpp">void bar() { cout << A<T>::foo << endl; }</code>
Tingkah laku ini didokumenkan dalam manual GCC, yang menyediakan maklumat tambahan untuk menyelesaikan isu yang serupa. Dengan menggunakan teknik ini, pembangun boleh memastikan kejayaan penyusunan hierarki kelas templat dengan kebergantungan ahli.
Atas ialah kandungan terperinci Mengapa GCC Gagal Mengenali Ahli Kelas Asas dalam Kelas Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!