Rumah >pembangunan bahagian belakang >C++ >Mengapa Pencarian Bergantung Argumentasi (ADL) Gagal dengan Templat Fungsi Termampat Secara Eksplisit?
ADL dan Carian Templat Fungsi
Templat fungsi memainkan peranan penting dalam pengaturcaraan C, membolehkan penggunaan semula kod dan fungsi generik. Walau bagaimanapun, had halus timbul apabila menggunakan Argument Dependent Lookup (ADL) untuk mencari templat fungsi dalam ruang nama tertentu.
Isu ini menjelma sendiri apabila cuba memanggil templat fungsi dengan hujah templat eksplisit, seperti yang digambarkan dalam kod berikut coretan:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }
Punca di sebalik kegagalan ini berpunca daripada klausa tertentu dalam Piawaian C. Mengikut Piawaian C 03 14.8.1.6, ADL tidak terpakai apabila memanggil templat fungsi dengan hujah templat eksplisit melainkan templat fungsi dengan nama itu kelihatan pada titik panggilan.
Dalam contoh di atas, terdapat tiada templat fungsi bernama frob kelihatan dalam skop semasa apabila frob<0>(f); dipanggil. Oleh itu, ADL tidak dicetuskan dan pengkompil gagal mencari templat fungsi yang diingini.
Untuk memintas pengehadan ini, seseorang boleh menentukan ruang nama secara eksplisit sebelum templat fungsi, seperti yang ditunjukkan di bawah:
ns::frob<0>(f);
Dalam kes ini, ADL tidak diperlukan kerana templat fungsi dipanggil terus daripada yang mengandungi ruang nama.
Contoh kod berikut seterusnya menggambarkan kelakuan ADL dengan templat fungsi:
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, templat fungsi f ditakrifkan dalam kedua-dua ruang nama A dan C. Apabila panggil f<3>(b); dibuat, pengkompil terlebih dahulu menyemak skop semasa dan tidak menemui templat f yang kelihatan. ADL kemudiannya digunakan, tetapi kerana f ialah nama yang tidak layak, ia tidak dapat mencari templat fungsi dalam ruang nama lain.
Untuk memanggil templat dari ruang nama C, seseorang mesti melayakkan nama dengan C::f atau menggunakan arahan secara eksplisit seperti yang ditunjukkan dalam kod.
Atas ialah kandungan terperinci Mengapa Pencarian Bergantung Argumentasi (ADL) Gagal dengan Templat Fungsi Termampat Secara Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!