Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengkhususan Eksplisit Ahli Berfungsi Di Luar Ruang Namanya Menyebabkan Ralat Penyusunan C?
Dalam kelas templat CConstraint, pengkhususan eksplisit fungsi ahli Verify untuk int ditakrifkan di luar ruang nama kelas. Ini menyebabkan ralat dalam g disebabkan oleh pelanggaran piawaian C.
Menurut C 03 §14.7.3/2, pengkhususan eksplisit mesti diisytiharkan dalam ruang nama yang templat adalah ahli atau, untuk ahli templat, dalam ruang nama di mana kelas yang disertakan atau templat kelas yang disertakan adalah ahli.
Untuk menyelesaikan isu ini, yang eksplisit pengkhususan Verify for int mesti diisytiharkan dalam ruang nama CConstraint. Ini boleh dicapai dengan menggunakan kod yang diubah suai berikut:
template
kelas CCconstraint
{
awam:
CConstraint() { } virtual ~CConstraint() { } template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int position, int constraints[]) { }
};
Selain itu, memandangkan pengkhususan eksplisit fungsi ahli memerlukan pengkhususan eksplisit kelas yang mengandungi , penyelesaian yang lebih baik ialah mengalihkan fungsi Verify keluar dari kelas dan ke dalam yang berasingan ruang nama:
perincian ruang nama
{
template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int position, int constraints[]) { }
}
template
kelas Cconstraint
{
// ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); }
};
Atas ialah kandungan terperinci Mengapa Pengkhususan Eksplisit Ahli Berfungsi Di Luar Ruang Namanya Menyebabkan Ralat Penyusunan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!