Rumah > Artikel > pembangunan bahagian belakang > Mengapakah GCC Menolak Pengkhususan Eksplisit di Luar Ruang Nama?
Ketidakkonsistenan GCC dengan Standard untuk Pengkhususan Eksplisit dalam Skop Bukan Ruang Nama
Piawaian C secara eksplisit membenarkan pengkhususan templat eksplisit diisytiharkan dalam sebarang skop di mana templat utama yang sepadan boleh ditakrifkan. Walau bagaimanapun, tingkah laku GCC menyimpang daripada piawaian ini. Percanggahan ini telah diperhatikan dalam versi terkini GCC, di mana pengkhususan eksplisit yang diisytiharkan di luar ruang nama gagal dihimpun.
Untuk menggambarkan isu ini, pertimbangkan kod berikut:
template<typename T> struct Widget { template<typename U> void foo(U) { } template<> void foo(int*) { } };
Sementara ini kod berjaya disusun dalam Clang, ia menghadapi ralat dalam GCC:
error: explicit specialization in non-namespace scope 'struct Widget<T>'
Ralat ini tidak konsisten dengan standard C, yang secara eksplisit membenarkan pengkhususan eksplisit dalam skop bukan ruang nama. Menurut perenggan 2 [temp.expl.spec] dalam piawaian C:
"Pengkhususan eksplisit boleh diisytiharkan dalam mana-mana skop di mana templat utama yang sepadan boleh ditakrifkan."
Sisihan daripada piawai ini membentuk pepijat yang berpotensi dalam GCC. Untuk melaporkan isu ini, ikut langkah berikut:
Dengan melaporkan isu ini, anda boleh menyumbang kepada penambahbaikan GCC dan memastikan ia mematuhi sepenuhnya C standard.
Atas ialah kandungan terperinci Mengapakah GCC Menolak Pengkhususan Eksplisit di Luar Ruang Nama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!