Rumah > Artikel > pembangunan bahagian belakang > Mengapakah GCC Melemparkan Ralat \"Tidak Diisytiharkan\" Apabila Mengakses Ahli Kelas Asas dalam Templat?
GCC Pitfall: Mengakses Ahli Kelas Asas dengan Ketergantungan Argumen Templat
Kod ini mempamerkan ralat kompilasi yang membingungkan dalam GCC tetapi berjaya dalam Visual Studio:
template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } };
GCC menimbulkan ralat: "foo' tidak diisytiharkan dalam skop ini," walaupun menjadi ahli kelas asas. Walau bagaimanapun, mengubah suai kod untuk merujuk ahli kelas asas secara eksplisit melalui "this->foo" menyelesaikan isu.
Penjelasan
GCC mengikut piawaian C, yang melarang inferens ahli kelas asas semasa penyusunan templat. Dalam versi terdahulu, GCC membuat kesimpulan ahli dengan menghuraikan kelas asas, tetapi ini boleh menyebabkan konflik.
Untuk menyelesaikannya, pastikan akses eksplisit kepada ahli kelas asas dalam templat:
Gunakan "ini" untuk merujuk ahli:
void bar() { cout << this->foo << endl; }
Nyatakan nama kelas asas:
void bar() { cout << A<T>::foo << endl; }
Dengan mematuhi garis panduan ini, pembangun boleh menghalang ralat penyusunan dan memastikan GCC mengendalikan akses ahli kelas asas seperti yang dimaksudkan dalam templat. Butiran lanjut tersedia dalam manual GCC.
Atas ialah kandungan terperinci Mengapakah GCC Melemparkan Ralat \"Tidak Diisytiharkan\" Apabila Mengakses Ahli Kelas Asas dalam Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!