Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-02 11:15:02
asal
594 orang telah melayarinya

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; }
};
Salin selepas log masuk

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; }
    Salin selepas log masuk
  • Nyatakan nama kelas asas:

    void bar() { cout << A<T>::foo << endl; }
    Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan