Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengkhususan Eksplisit Ahli Berfungsi dalam Kelas Templat C Menyebabkan Ralat 'Skop Bukan Ruang Nama'?

Mengapa Pengkhususan Eksplisit Ahli Berfungsi dalam Kelas Templat C Menyebabkan Ralat 'Skop Bukan Ruang Nama'?

Mary-Kate Olsen
Lepaskan: 2024-12-04 06:15:17
asal
1027 orang telah melayarinya

Why Does Explicit Specialization of a Member Function in a C   Template Class Cause a

Pengkhususan Eksplisit dalam Skop Bukan Ruang Nama

Pertanyaan:

Dalam kelas templat C CConstraint, mengapa pengkompil menghasilkan ralat "Pengkhususan eksplisit dalam skop bukan ruang nama" apabila fungsi ahli khusus secara eksplisit?

Respons:

Isu timbul kerana pengkhususan eksplisit dalam CConstraint tidak diisytiharkan dalam ruang nama. Menurut piawaian C 03, bahagian 14.7.3/2, pengkhususan eksplisit mesti berada dalam ruang nama templat atau, untuk templat ahli, dalam ruang nama kelas atau templat kelas yang disertakan.

Selain itu, bahagian C 03 14.7.3/3 mengehadkan pengkhususan eksplisit fungsi ahli melainkan kelas yang mengandungi itu sendiri secara eksplisit khusus.

Penyelesaian:

Untuk menyelesaikan isu ini, satu pendekatan ialah memajukan fungsi ahli Verify() kepada fungsi bebas khusus yang ditakrifkan dalam ruang nama yang berasingan, seperti ditunjukkan di bawah:

namespace detail {
    template <typename TL> void Verify(int, int[]) {}
    template <>            void Verify<int>(int, int[]) {}
}

template<typename T> class CConstraint {
    // ...
    template <typename TL> void Verify(int position, int constraints[]) {
        detail::Verify<TL>(position, constraints);
    }
};
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Pengkhususan Eksplisit Ahli Berfungsi dalam Kelas Templat C Menyebabkan Ralat 'Skop Bukan Ruang Nama'?. 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