Rumah >pembangunan bahagian belakang >C++ >Mengapakah Saya Tidak Boleh Menjemput Pembina Templat secara Eksplisit dalam Senarai C Initializer?
Seruan Pembina Templat Eksplisit dalam C
Dalam C , tidak mungkin untuk memanggil pembina templat secara eksplisit dalam senarai pemula. Ini disebabkan oleh sintaks khusus yang digunakan untuk hujah templat, yang mengikut nama templat fungsi dan bukannya disertakan dalam kurungan semasa pembinaan.
Seperti yang dinyatakan dalam Standard C (14.8.1/7):
[Nota: 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, terdapat bukan cara untuk menyediakan senarai hujah templat eksplisit untuk templat fungsi ini. ]
Oleh itu, contoh berikut tidak akan berfungsi:
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
Dalam kes ini, pengkompil akan cuba mentafsir t
Penyelesaian
Untuk mengatasi had ini, seseorang boleh menggunakan templat fungsi yang mengambil jenis identiti sebagai hujah:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Diberi takrifan identiti berikut daripada Boost:
template<typename T> struct identity { typedef T type; };
atau, dalam C 20, menggunakan std::type_identity:
using ::std::type_identity;
pendekatan ini dengan berkesan membenarkan menghantar hujah templat kepada pembina dalam senarai pemula.
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!