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
Lepaskan: 2024-12-10 07:56:12
asal
439 orang telah melayarinya

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

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

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!

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