Potongan Argumen Templat dan Konteks Tak Terdeduksi
Dalam C , potongan hujah templat membolehkan pengkompil menentukan jenis parameter templat berdasarkan jenis daripada argumen yang dihantar ke fungsi atau kelas templat. Walau bagaimanapun, mekanisme ini mungkin gagal dalam senario tertentu yang melibatkan konteks tidak terdeduksi.
Pertimbangkan coretan kod berikut:
template <class T> struct S { typedef T& type; }; template <class A> A temp(S<A>::type a1) { return a1; } template <class A, class B> B temp2(S<A>::type a1, B a2) { return a1 + a2; }
Di sini, struktur S berfungsi sebagai cara untuk mendapatkan rujukan kepada jenis dipegang oleh parameter templat A. Walau bagaimanapun, apabila cuba memanggil fungsi ini dengan nilai integer, seperti yang ditunjukkan di bawah, pengkompil melaporkan ralat:
int main() { char c = 6; int d = 7; int res = temp(c); int res2 = temp2(d, 7); }
Mesej Ralat:
Penjelasan:
Isu ini timbul kerana jenis A digunakan semata-mata dalam konteks yang tidak disimpulkan, yang bermaksud pengkompil tidak boleh membuat kesimpulan daripada hujah diserahkan kepada fungsi. Khususnya, S::type dianggap tidak terdeduksi kerana ia muncul dalam jenis templat bersarang dan tidak berkaitan secara langsung dengan hujah temp atau temp2.
Penyelesaian:
Untuk menyelesaikan isu ini dan mendayakan potongan hujah templat, jenis A mesti dinyatakan dengan jelas semasa memanggil fungsi, seperti yang ditunjukkan di bawah:
temp<char>(c);
Spesifikasi eksplisit ini membolehkan pengkompil menentukan jenis A dan berjaya membuat instantiat fungsi templat.
Atas ialah kandungan terperinci Mengapa Potongan Hujah Templat Gagal dalam Konteks Tidak Terdeduksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!