Kod anda melibatkan kelas templat A dengan pembina yang mengambil int dan operator terlampau beban yang mengembalikan tika A. Walau bagaimanapun, apabila cuba melakukan penukaran tersirat daripada int kepada A, anda menghadapi ralat kompilasi. Artikel ini meneroka isu ini dan membentangkan penyelesaian yang elegan menggunakan persahabatan templat.
Semasa resolusi lebihan untuk fungsi templat, pengkompil melakukan pemotongan jenis pada argumen untuk menentukan templat instansiasi. Walau bagaimanapun, potongan jenis hanya mempertimbangkan padanan tepat, menghalang penukaran tersirat. Ini menjadi jelas dengan fungsi standard seperti std::max dan std::min, yang gagal jika argumen mempunyai jenis yang berbeza disebabkan potongan jenis yang tepat.
Penyelesaian kepada masalah ini terletak pada penggunaan template persahabatan. Dengan mengisytiharkan fungsi rakan bukan ahli dalam takrifan kelas, anda boleh mencipta fungsi percuma pada peringkat ruang nama yang mempunyai tandatangan yang mencerminkan jenis instantiated. Mekanisme ini membenarkan pengkompil melakukan penukaran tersirat semasa penilaian hujah.
Dalam contoh kod yang disediakan:
template <typename T> class test { friend test operator+(test const &, test const &); // Inline friend declaration };
Untuk setiap instantiasi (test
test<int> operator+(test<int> const &, test<int> const &);
Fungsi percuma ini sentiasa ditakrifkan, tanpa mengira penggunaan.
Templat persahabatan memberikan kemurahan dan membolehkan resolusi beban berlebihan untuk dipertimbangkan penukaran tersirat. Walau bagaimanapun, ia juga mempunyai implikasi untuk carian fungsi:
Dengan memanfaatkan persahabatan templat, isu dengan penukaran jenis tersirat dalam yang disediakan kod diselesaikan. Mekanisme ini ialah alat yang berkuasa untuk mendayakan resolusi beban lampau dengan penukaran tersirat, walaupun ia disertakan dengan pengehadan tertentu berkenaan carian fungsi dan kebolehaksesan.
Atas ialah kandungan terperinci Bagaimanakah Persahabatan Templat Mendayakan Penukaran Jenis Tersirat dalam Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!