Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-07 21:51:03
asal
806 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan