Apabila cuba mengkhususkan sebahagian bar fungsi ahli kelas templat foo, pengguna mungkin menghadapi ralat yang menunjukkan tidak sah penggunaan jenis yang tidak lengkap. Khususnya, coretan kod berikut menjana ralat:
template <typename S, typename T> struct foo { void bar(); }; template <> void foo<int, T>::bar() { }
Ini kerana pengkompil tidak boleh menentukan jenis lengkap kelas templat separa khusus sebelum menemui definisi fungsi khusus. Untuk menyelesaikan isu ini, seseorang mesti mengkhususkan sebahagian keseluruhan kelas templat, seperti yang ditunjukkan di bawah:
template <typename S, typename T> struct foo { void bar() { // If S is not int, do default behavior for non-int S if constexpr(!std::is_same<S, int>::value) { // Default behavior } // If S is int, do specialized behavior unique to int else { // Int-specific behavior } } };
Dengan mengkhususkan sebahagian keseluruhan kelas templat, pengkompil boleh membuat kesimpulan jenis lengkap sebelum menemui definisi fungsi khusus. Ini membolehkan fungsi khusus mengakses dan mengubah suai ahli khusus untuk pengkhususan yang baru diperkenalkan.
Atas ialah kandungan terperinci Mengapa Pengkhususan Separa Fungsi Ahli Templat Gagal dengan Ralat Jenis Tidak Lengkap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!