Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah GCC Memerlukan Akses Ahli Eksplisit untuk Ahli Kelas Asas Templat?

Mengapakah GCC Memerlukan Akses Ahli Eksplisit untuk Ahli Kelas Asas Templat?

DDD
DDDasal
2024-11-01 10:52:02850semak imbas

Why Does GCC Require Explicit Member Access for Template Base Class Members?

Penguatkuasaan Tegas Ketergantungan Argumen Templat GCC

Kod yang dibentangkan menimbulkan isu yang berlaku apabila menggunakan GCC, tetapi tidak dengan Visual Studio. 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; }
};

gagal untuk menyusun dengan GCC, tetapi berjaya menyusun dengan Visual Studio. Ralat menggesa pembangun untuk menambah ini-> kepada ungkapan untuk mengakses ahli foo dalam bar kaedah.

Tingkah laku ini berpunca daripada pematuhan ketat GCC kepada spesifikasi C. Versi terdahulu GCC membuat kesimpulan akses ahli daripada kelas asas templat dengan menghuraikannya. Walau bagaimanapun, ISO C menganggap inferens ini berpotensi bermasalah dan telah menafikannya.

Penyelesaian dalam senario ini adalah dengan merujuk secara eksplisit ahli foo menggunakan ini-> atau untuk menentukan kelas asas secara eksplisit, seperti yang ditunjukkan dalam contoh berikut:

<code class="cpp">template <typename T> class A {
    public:
        T foo;
};

template <typename T> class B: public A<T> {
    public:
        void bar() { cout << A<T>::foo << endl; }
};</code>

Dengan berbuat demikian, GCC boleh menentukan jenis kelas asas dan menyelesaikan akses ahli dengan sewajarnya.

Atas ialah kandungan terperinci Mengapakah GCC Memerlukan Akses Ahli Eksplisit untuk Ahli Kelas Asas 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