Rumah >pembangunan bahagian belakang >C++ >Mengapa Carian Bergantung Hujah (ADL) Tidak Menemui Templat Fungsi Tanpa Kelayakan Ruang Nama Eksplisit?
Mengapa Templat Fungsi Menentang Penemuan ADL
Dalam C , pencarian bergantung hujah (ADL) memberi kuasa kepada penyusun untuk mencari fungsi tanpa kelayakan ruang nama yang jelas. Walau bagaimanapun, apabila ia melibatkan templat fungsi, ADL menghadapi had.
Inti perkara ini ditangkap dalam C Standard 03 14.8.1.6:
"Tetapi apabila templat fungsi dengan hujah templat eksplisit digunakan, panggilan tidak mempunyai bentuk sintaksis yang betul melainkan terdapat templat fungsi dengan nama itu boleh dilihat pada titik panggil."
Mari kita pecahkan dengan contoh:
Dalam coretan berikut, kami mempunyai templat fungsi frob dan fungsi bukan templat bukan_templat dalam ruang nama ns:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} }
Semasa menggunakan non_template secara langsung dibenarkan, cuba memanggil frob<0> pada objek foo gagal untuk disusun.
Mengapa?
Kerana panggilan frob<0>(f) secara sintaksis tidak sah tanpa kelayakan ruang nama. Tanpa ruang nama yang jelas, pengkompil tidak dapat mengetahui templat frob mana yang hendak dicari semasa ADL.
Untuk membetulkannya, seseorang mesti melayakkan panggilan untuk frob secara eksplisit atau membawa ruang nama ke dalam skop menggunakan menggunakan. Dengan berbuat demikian, pengkompil kemudian boleh menggunakan ADL untuk mencari definisi templat yang betul.
Atas ialah kandungan terperinci Mengapa Carian Bergantung Hujah (ADL) Tidak Menemui Templat Fungsi Tanpa Kelayakan Ruang Nama Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!