Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Resolusi Lebihan Gagal Apabila Menstrim Objek melalui Penukaran Tersirat kepada Rentetan?

Mengapa Resolusi Lebihan Gagal Apabila Menstrim Objek melalui Penukaran Tersirat kepada Rentetan?

Patricia Arquette
Patricia Arquetteasal
2024-11-07 21:51:03710semak imbas

Why Does Overload Resolution Fail When Streaming an Object via Implicit Conversion to String?

Kegagalan Resolusi Lebihan Apabila Menstriman Objek melalui Penukaran Tersirat kepada Rentetan

Coretan kod yang disediakan mentakrifkan struct NameType dengan operator std::string() overload dan Person struct yang mengandungi contoh NameType bernama nama. Apabila cuba menstrim objek Orang menggunakan std::cout << p.penyataan nama, pengkompil gagal menyelesaikan beban berlebihan kerana ralat dalam mencari operator yang sepadan<< untuk ungkapan Person::name.

Isu timbul kerana peraturan C 98 yang melarang penukaran tersirat apabila salah satu argumen fungsi mengandungi parameter templat yang terlibat dalam potongan hujah templat. Dalam kes ini, lebihan yang diingini ialah instantiasi templat dengan carta parameter templat, sifat dan Peruntukan. Memandangkan semua hujah mengandungi parameter templat yang terlibat dalam potongan hujah, penukaran tersirat tidak dibenarkan, mengakibatkan kegagalan resolusi beban lampau.

Untuk menyelesaikan isu ini, pengisytiharan lebihan eksplisit untuk operator<< yang mengendalikan struct Orang harus disediakan. Ini boleh dicapai dengan mentakrifkan fungsi lebihan tersuai dengan tandatangan berikut:

<code class="cpp">std::ostream& operator<<(std::ostream& os, const Person& p);</code>

Dengan menyediakan lebihan eksplisit, pengkompil boleh menyelesaikan lebihan dan berjaya menstrim objek Orang.

Atas ialah kandungan terperinci Mengapa Resolusi Lebihan Gagal Apabila Menstrim Objek melalui Penukaran Tersirat kepada Rentetan?. 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