Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah GCC Melemparkan Ralat \"Tidak Diisytiharkan\" Apabila Mengakses Ahli Kelas Asas dalam Templat?

Mengapakah GCC Melemparkan Ralat \"Tidak Diisytiharkan\" Apabila Mengakses Ahli Kelas Asas dalam Templat?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 11:15:02517semak imbas

Why Does GCC Throw a

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!

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