Dalam C, pengkhususan templat separa membenarkan penyesuaian templat untuk jenis tertentu. Walau bagaimanapun, apabila bekerja dengan fungsi ahli dalam pengkhususan separa, anda mungkin menghadapi ralat "penggunaan tidak sah jenis tidak lengkap".
Pertimbangkan kod berikut:
template <typename S, typename T> struct foo { void bar(); }; template <typename T> void foo<int, T>::bar() { }
Kod ini cuba mengkhususkan sebahagiannya fungsi bar untuk kes di mana parameter templat pertama (S) ditetapkan kepada int. Walau bagaimanapun, ia gagal untuk menyusun dengan ralat berikut:
invalid use of incomplete type 'struct foo<int, T>' declaration of 'struct foo<int, T>'
Sebab ralat ini ialah pengkhususan separa fungsi ahli memerlukan takrifan lengkap templat yang disertakan. Dalam contoh di atas, pengkhususan templat untuk foo
template <typename S, typename T> struct foo { void bar(); }; template <> struct foo<int, T> { void bar() { } };
Dalam kod yang diubah suai ini, kami mengkhususkan sebahagian keseluruhan templat, yang memberikan maklumat lengkap tentang jenis tertentu. Akibatnya, kod akan berjaya disusun.
Adalah penting untuk ambil perhatian bahawa pengkhususan separa fungsi ahli bukanlah kaedah pilihan dan boleh membawa kepada isu, terutamanya apabila bekerja dengan kelas templat yang besar. Pertimbangkan untuk menggunakan pendekatan alternatif seperti struktur ahli templat atau warisan daripada templat separa khusus untuk mencapai gelagat yang diingini.
Atas ialah kandungan terperinci Mengapa Pengkhususan Templat Separa Fungsi Ahli Menyebabkan Ralat 'Penggunaan Jenis Tidak Lengkap' dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!