Rumah >pembangunan bahagian belakang >C++ >Mengapakah Penstriman Objek dengan Penukaran Tersirat kepada Rentetan Menyebabkan Kegagalan Resolusi Lebihan?

Mengapakah Penstriman Objek dengan Penukaran Tersirat kepada Rentetan Menyebabkan Kegagalan Resolusi Lebihan?

Susan Sarandon
Susan Sarandonasal
2024-11-05 00:57:01354semak imbas

Why Does Streaming an Object with Implicit Conversion to String Cause Overload Resolution Failure?

Kegagalan Penyelesaian Lebihan Apabila Menstriman Objek melalui Penukaran Tersirat kepada Rentetan

Penerangan Isu

Tersirat penukaran kepada rentetan biasanya tidak digalakkan, dan membebankan operator output (<<) untuk jenis yang ditentukan pengguna ialah pendekatan yang disyorkan. Walau bagaimanapun, kod yang melibatkan penukaran tersirat dan penstriman objek boleh mengakibatkan kekaburan resolusi beban berlebihan.

Pertimbangkan contoh berikut:

<code class="cpp">struct NameType {
  operator std::string() { return "wobble"; }
};

struct Person {
  NameType name;
};

int main() {
  std::cout << "bobble";
  std::cout << "wibble";

  Person p;
  std::cout << p.name;
}</code>

Mesej Ralat

Menyusun kod ini dengan GCC 4.3.4 menghasilkan yang berikut ralat:

prog.cpp: In function ‘int main()’:
prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’

Punca Punca

Set lebihan beban tidak termasuk lebihan beban yang diingini disebabkan oleh gabungan faktor:

  • Penyegerakan Templat: Beban yang diingini ialah instantiasi fungsi templat dengan beberapa templat parameter.
  • Larangan Penukaran Tersirat: Penukaran tersirat kepada rentetan (NameType::operator std::string) menghalang beban yang diingini daripada dipertimbangkan.

Sekatan ADL

Pencarian bergantung kepada hujah (ADL) tidak terlibat secara langsung dalam isu ini. ADL ialah ciri masa kompilasi yang digunakan apabila pengkompil sedang menyelesaikan panggilan fungsi. Dalam kes ini, penukaran tersirat kepada rentetan dilakukan oleh pengkompil tanpa sebarang panggilan fungsi yang terlibat.

Atas ialah kandungan terperinci Mengapakah Penstriman Objek dengan Penukaran Tersirat kepada Rentetan Menyebabkan 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