Rumah >pembangunan bahagian belakang >C++ >Mengapakah Penukaran Tersirat Seseorang Mengobjek kepada Rentetan Mengakibatkan Kegagalan Resolusi Lebihan?

Mengapakah Penukaran Tersirat Seseorang Mengobjek kepada Rentetan Mengakibatkan Kegagalan Resolusi Lebihan?

Barbara Streisand
Barbara Streisandasal
2024-11-05 11:11:02572semak imbas

Why Does Implicit Conversion of a Person Object to a String Result in Overload Resolution Failure?

Kegagalan Penyelesaian Lebih Muatan Semasa Penukaran Tersirat Objek kepada Rentetan

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!

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