Dalam C , tidak mungkin untuk menggunakan pembina templat secara eksplisit dalam senarai pemula. Pertimbangkan contoh berikut:
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
Kod ini akan gagal untuk disusun, kerana C Standard secara jelas tidak membenarkan senarai argumen templat eksplisit untuk templat fungsi ahli pembina. Ini disebabkan oleh sintaks unik pembina, yang tidak mempunyai nama fungsi.
Penjelasan: C Standard menyatakan dalam Bahagian 14.8.1/7:
"Oleh kerana senarai hujah templat eksplisit mengikut nama templat fungsi, dan kerana templat fungsi ahli penukaran dan templat fungsi ahli pembina dipanggil tanpa menggunakan nama fungsi, tiada cara untuk menyediakan senarai hujah templat eksplisit untuk templat fungsi ini."
Penyelesaian: Jika seruan eksplisit pembina templat diperlukan dalam senarai pemula, penyelesaian boleh dibuat digunakan menggunakan jenis tersuai dengan pembina yang menerima parameter templat sebagai hujah:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Dalam kes ini, identiti taip daripada perpustakaan Boost atau std::type_identity daripada C 20 boleh digunakan untuk mewakili jenis parameter templat. Ini membolehkan pembina templat digunakan secara tidak langsung menggunakan objek jenis tersuai ini.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!