Dalam C , kaedah kelas boleh terlebih muatan untuk menerima jenis parameter yang berbeza Walau bagaimanapun, kadangkala rentetan literal mungkin secara tidak dijangka memadankan lebihan jenis boolean dan bukannya lebihan std::string yang dijangkakan.
Perihalan masalah:
Andaikan kita mempunyai kelas Output yang ditakrifkan seperti berikut:
<code class="cpp">class Output { public: static void Print(bool value) { std::cout << (value ? "True" : "False"); } static void Print(std::string value) { std::cout << value; } };</code>
Apabila memanggil Output::Print("Hello World "), hasil output ialah "Benar" dan bukannya "Hello World" yang dijangkakan.
Analisis masalah:
Walaupun kami mentakrifkan std::string overload, "Hello World" sebenarnya ialah pemalar tatasusunan aksara yang boleh ditukar secara tersirat kepada bool. Pengkompil lebih suka penukaran standard ini berbanding pembina penukaran std::string yang ditentukan pengguna.
Menurut standard C (§13.3.3.2/2), pesanan penukaran standard mengatasi pesanan penukaran yang ditentukan pengguna. Oleh itu, pengkompil memilih bool overload kerana ia mempunyai tertib penukaran yang lebih baik.
Penyelesaian:
Untuk memanggil secara eksplisit std::string overload, kita perlu secara eksplisit menghantar "Hello World" sebagai std::string:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
Atas ialah kandungan terperinci Mengapakah `Output::Print(\'Hello World\')` mencetak \'True\' dan bukannya \'Hello World\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!