ADL Kegagalan dalam Mencari Templat Fungsi
Dalam C , pencarian bergantung hujah (ADL) membolehkan carian untuk pengisytiharan nama fungsi dalam ruang nama yang dikaitkan dengan argumen dalam panggilan fungsi. Walau bagaimanapun, terdapat sekatan dalam spesifikasi C apabila ia berkaitan dengan templat fungsi dan ADL.
Sekatan
Menurut C Standard 14.8.1.6, ADL tidak digunakan pada templat fungsi melainkan terdapat templat fungsi yang boleh dilihat dengan nama yang sama pada titik panggilan. Ini bermakna, untuk templat fungsi dengan hujah templat eksplisit, panggilan mesti mempunyai bentuk sintaksis yang betul dengan templat fungsi yang boleh dilihat.
Contoh
Pertimbangkan contoh berikut:
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. }
Dalam contoh ini, ADL mencari dan menyelesaikan non_template untuk panggilan pertama kerana non_template ialah fungsi biasa. Walau bagaimanapun, untuk panggilan kedua, frob ialah templat fungsi. Memandangkan tiada templat fungsi frob yang kelihatan pada titik panggilan, ADL gagal dan panggilan tidak dibentuk secara sintaksis dengan baik.
Menangani Sekatan
Kepada atasi sekatan ini, pastikan templat fungsi kelihatan dalam skop panggilan. Ini boleh dicapai dengan mengisytiharkan templat fungsi dalam ruang nama semasa atau dengan melayakkan panggilan dengan ruang nama yang mengandungi templat fungsi.
Atas ialah kandungan terperinci Mengapa Carian Bergantung Hujah (ADL) Gagal untuk Templat Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!