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); } };
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!