Rumah >pembangunan bahagian belakang >C++ >Mengapakah Penukaran Tersirat Seseorang Mengobjek kepada Rentetan Mengakibatkan Kegagalan Resolusi Lebihan?
Penukaran rentetan tersirat secara amnya tidak digalakkan, dengan lebihan operator untuk Orang menjadi penyelesaian yang lebih sesuai. Walau bagaimanapun, mari kita periksa kod berikut untuk menggambarkan isu:
<code class="cpp">#include <string> #include <ostream> #include <iostream> struct NameType { operator std::string() { return "wobble"; } }; struct Person { NameType name; }; int main() { std::cout << std::string("bobble"); std::cout << "wibble"; Person p; std::cout << p.name; // Error occurs here }</code>
Kod menyusun tanpa ralat apabila menggunakan GCC 4.3.4, memberikan output:
<code class="Bash">bobble wibble</code>
Walau bagaimanapun, cuba untuk secara tersirat menukar objek Orang kepada rentetan menggunakan << operator gagal dengan ralat resolusi beban lampau:
<code class="Bash">prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’</code>
Dalam keadaan ini, operator << terlampau beban untuk mengendalikan std::string dan const char*, walau bagaimanapun, tidak terdapat lebihan pratakrif yang menerima objek Person dan secara tersirat menukarnya kepada rentetan. Akibatnya, pengkompil gagal menyelesaikan lebihan beban.
Untuk membetulkan isu ini, anda harus menentukan operator eksplisit << untuk struct Orang sebagai fungsi rakan, membenarkan penukaran tersirat daripada objek Orang kepada rentetan berfungsi dengan betul.
Atas ialah kandungan terperinci Mengapakah Penukaran Tersirat Seseorang Mengobjek kepada Rentetan Mengakibatkan Kegagalan Resolusi Lebihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!