Pengkhususan Eksplisit Di Luar Skop Ruang Nama: Ralat dalam Bukan Standard G
Pengaturcaraan templat C melibatkan pengkhususan eksplisit ahli kelas untuk kod yang cekap generasi. Walau bagaimanapun, penempatan pengkhususan eksplisit adalah penting, seperti yang ditunjukkan oleh coretan kod berikut:
template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } };
Apabila dikompilasi dengan g , kod ini mengakibatkan ralat:
Explicit specialization in non-namespace scope 'class CConstraint'
Untuk memahami ralat ini, kita perlu meneliti piawaian C, yang menentukan bahawa pengkhususan eksplisit mesti diisytiharkan dalam ruang nama yang templatnya adalah ahli. Dalam contoh di atas, CConstraint tidak diisytiharkan dalam mana-mana ruang nama, dan oleh itu pengkhususan eksplisit Verify
Penyusun VC, walau bagaimanapun, tidak mematuhi dalam kes ini, membenarkan pengkhususan eksplisit di luar skop ruang nama. Tingkah laku ini tidak standard dan tidak boleh dipercayai.
Penyelesaian:
Untuk menyelesaikan isu ini dan memastikan pematuhan dengan piawaian C, pengkhususan eksplisit mesti diisytiharkan dalam ruang nama yang sama dengan templat yang mereka pakar. Berikut ialah versi kod yang diperbetulkan:
namespace MyNamespace { template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } }; }
Dengan merangkum CConstraint dalam ruang nama MyNamespace, kami memastikan bahawa pengkhususan eksplisitnya turut diisytiharkan dalam ruang nama itu, menyelesaikan ralat penyusunan.
Selain itu, memandangkan C 03 melarang pengkhususan fungsi ahli tanpa mengkhususkan kelas yang mengandungi secara eksplisit, kami juga boleh mempertimbangkan menggunakan pendekatan fungsi percuma, seperti yang dicadangkan dalam jawapan yang disediakan:
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 Kelas Gagal Di Luar Ruang Nama dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!