Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa GCC Gagal Mengenali Ahli Kelas Asas dalam Kelas Templat?

Mengapa GCC Gagal Mengenali Ahli Kelas Asas dalam Kelas Templat?

Barbara Streisand
Barbara Streisandasal
2024-11-02 17:12:02427semak imbas

Why Does GCC Fail to Recognize Base Class Members in Template Classes?

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:

  1. Gunakan penuding ini untuk mengakses pangkalan ahli kelas:
<code class="cpp">void bar() { cout << this->foo << endl; }</code>
  1. Rujuk kelas asas secara eksplisit dalam akses ahli:
<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!

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