Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengakses Pembolehubah Diwarisi Dilindungi dalam Kelas Induk Templat dalam C?

Bagaimanakah Saya Boleh Mengakses Pembolehubah Diwarisi Dilindungi dalam Kelas Induk Templat dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-12-10 07:56:12414semak imbas

How Can I Access Protected Inherited Variables in Templated Parent Classes in C  ?

Mengakses Pembolehubah Dilindungi Diwarisi dalam Kelas Induk Templat

Isu timbul apabila cuba mengakses pembolehubah diwarisi yang dilindungi daripada kelas induk templat dalam C . Pertimbangkan kod C berikut:

template<class T> class Foo {
    protected:
        int a;
};

template<class T> class Bar : public Foo<T> {
    protected:
        int b;
};

template<class T> int Bar<T>::Perna(int u) {
    int c = Foo<T>::a * 4; // This works
    return (a + b) * u;    // This doesn't
}

Dalam kes ini, GCC versi 3.4.6 dan lebih baharu menimbulkan ralat apabila cuba mengakses pembolehubah dilindungi a kelas Foo yang diwarisi. Penyusun lama, termasuk GCC 2.96 dan MSVC 6-9, membenarkan akses ini tanpa isu.

Penjelasan Ralat

Ralat berlaku kerana, menurut piawaian C, tidak layak nama dalam templat mesti dicari semasa definisi templat. Walau bagaimanapun, takrif kelas asas bergantung (seperti Foo dalam kes ini) mungkin tidak diketahui pada masa definisi templat. Ketidakpastian ini menghalang penyelesaian nama yang tidak layak.

Pematuhan Standard

Tingkah laku yang ditunjukkan oleh GCC 3.4.6 dan versi yang lebih baru adalah mematuhi piawaian C. Dengan mematuhi piawaian, penyusun ini memastikan ketepatan dan tingkah laku kod adalah konsisten merentas platform dan penyusun yang berbeza.

Resolusi

Untuk menyelesaikan isu ini dan mengakses warisan yang dilindungi pembolehubah, seseorang boleh sama ada menggunakan nama pembolehubah yang layak (cth., Foo::a) atau gunakan pengisytiharan "menggunakan". Contohnya:

template<class T>
int Bar<T>::Perna(int u) {
    int c = this->a * 4; // Access using the qualified name
    c = a * 4;          // Access using the "using" declaration
}

Dalam kod yang diubah suai ini, nama yang layak atau pengisytiharan "menggunakan" secara eksplisit menyatakan sumber pembolehubah, membenarkan pengkompil menyelesaikannya dengan betul.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Pembolehubah Diwarisi Dilindungi dalam Kelas Induk Templat dalam C?. 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