Rumah >pembangunan bahagian belakang >C++ >Mengapa Carian Bergantung Hujah (ADL) Tidak Menemui Templat Fungsi Tanpa Kelayakan Ruang Nama Eksplisit?

Mengapa Carian Bergantung Hujah (ADL) Tidak Menemui Templat Fungsi Tanpa Kelayakan Ruang Nama Eksplisit?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-10 08:28:13844semak imbas

Why Doesn't Argument-Dependent Lookup (ADL) Find Function Templates Without Explicit Namespace Qualification?

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&amp;) {}
    void non_template(foo const&amp;) {}
}

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn