Penukaran Jenis Tersirat dalam Potongan Templat
Dalam C, mekanisme penukaran jenis tersirat memainkan peranan penting dalam potongan hujah templat. Walau bagaimanapun, dalam senario tertentu, ia boleh membawa kepada gelagat yang tidak dijangka, seperti yang digambarkan oleh coretan kod di bawah:
<code class="cpp">#include<iostream> using namespace std; template<typename Dtype> class Scalar{ public: Scalar(Dtype v) : value_(v){} private: Dtype value_; }; template<typename Dtype> void func(int a, Scalar<Dtype> b){ cout << "ok" << endl; } int main(){ int a = 1; func(a, 2); // Incorrect conversion //int b = 2; //func(a, b); // Also incorrect return 0; }
Dalam kod yang disediakan, matlamatnya adalah untuk menggunakan fungsi templat dengan menukar int secara tersirat kepada Skalar Sebab di sebalik kegagalan ini ialah potongan hujah templat tidak menganggap pengguna- penukaran yang ditentukan. Dalam senario ini, penukaran daripada int kepada Skalar Untuk menyelesaikan isu ini, terdapat beberapa pilihan: Penukaran Eksplisit di Tapak Pemanggil: Paksa penukaran dengan menyediakan Skalar Panduan Potongan: Tentukan panduan potongan untuk Skalar dan fungsi panggilan: Pendekatan ini bergantung pada panduan potongan lalai, yang mencukupi dalam kes ini. Semerta Eksplisit: Buat seketika templat func untuk jenis yang diingini: Ini hanya berfungsi jika Scalar Kesimpulannya, potongan hujah templat tidak digunakan secara automatik kepada pengguna -penukaran yang ditentukan. Untuk menggunakan penukaran yang ditakrifkan pengguna dalam potongan hujah templat, adalah perlu sama ada menukar hujah secara eksplisit di tapak pemanggil, gunakan panduan potongan jika berkenaan atau nyatakan templat untuk jenis yang diingini secara eksplisit. Atas ialah kandungan terperinci Mengapa Penukaran Jenis Tersirat Gagal dalam Potongan Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
<code class="cpp">func(a, Scalar<int>{2}); </code>
<code class="cpp">func(a, Scalar{2}); // C++17 only</code>
<code class="cpp">func<int>(a, 2); </code>