ADL dan Templat Fungsi
Pencarian bergantung pada hujah (ADL) memainkan peranan penting dalam C dengan memudahkan carian automatik fungsi dan objek dalam ruang nama yang berkaitan berdasarkan jenis hujah yang digunakan. Walau bagaimanapun, mekanisme ini mempunyai pengehadan apabila ia melibatkan templat fungsi.
Sekatan untuk Mencari Templat Fungsi dengan ADL
Panggilan terakhir dalam coretan kod yang disediakan gagal dikompilasi kerana kepada sekatan dalam spesifikasi C. Menurut Seksyen 14.8.1.6 Piawaian C 03:
"Tetapi apabila templat fungsi dengan hujah templat eksplisit digunakan, panggilan itu tidak mempunyai bentuk sintaksis yang betul melainkan terdapat templat fungsi dengan nama itu boleh dilihat pada titik panggilan."
Ini bermakna ADL hanya boleh mencari templat fungsi yang boleh dilihat dalam skop panggilan. Dalam contoh yang diberikan, frob<0> ialah panggilan ke templat fungsi dengan hujah templat eksplisit. Walau bagaimanapun, tiada pengisytiharan templat frob yang kelihatan pada titik panggilan dalam utama.
Perbezaan daripada Nama Fungsi Ringkas
Sekatan tidak terpakai kepada ringkas nama fungsi. Untuk nama sedemikian, ADL digunakan walaupun fungsi itu tidak kelihatan dalam skop panggilan. Ini kerana panggilan itu masih mengekalkan bentuk sintaksis panggilan fungsi.
Contoh
Contoh berikut menggambarkan tingkah laku dengan lebih lanjut:
namespace A { struct B { }; template<int X> void f(B); } namespace C { template<class T> void f(T t); } void g(A::B b) { f<3>(b); //ill-formed: not a function call A::f<3>(b); //well-formed C::f<3>(b); //ill-formed; argument dependent lookup // applies only to unqualified names using C::f; f<3>(b); //well-formed because C::f is visible; then // A::f is found by argument dependent lookup }
Dalam contoh ini, panggilan ke f<3>(b) tidak terbentuk kerana tiada templat fungsi yang boleh dilihat bernama f wujud pada masa itu titik. Panggilan ke A::f<3>(b) dibentuk dengan baik kerana templat f boleh dilihat dalam ruang nama A. Panggilan ke C::f<3>(b) adalah tidak betul kerana ADL hanya digunakan untuk nama yang tidak layak. Menggunakan arahan penggunaan kepada alias C::f menjadikan panggilan ke f<3>(b) terbentuk dengan baik kerana nama f kini kelihatan pada titik panggilan.
Atas ialah kandungan terperinci Mengapa Carian Bergantung Argumen (ADL) Gagal Mencari Templat Fungsi dengan Argumen Templat Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!