Potongan Argumen Templat dan Penukaran Ditakrifkan Pengguna
Dalam pengaturcaraan templat C, tugas biasa ialah menghantar nilai satu jenis ke dalam fungsi templat yang mengharapkan hujah daripada jenis yang berbeza. Untuk memudahkan perkara ini, pengkompil menyediakan potongan hujah templat (TAD), yang boleh membuat kesimpulan secara automatik hujah templat berdasarkan jenis hujah sebenar.
Had Potongan Hujah Templat
Walau bagaimanapun, terdapat had untuk TAD. Satu had ialah ia tidak mempertimbangkan penukaran yang ditentukan pengguna. Ini bermakna jika anda mempunyai penukaran yang ditentukan pengguna daripada satu jenis kepada jenis yang lain, TAD tidak akan menggunakan penukaran tersebut untuk membuat kesimpulan hujah templat.
Kajian Kes
Pertimbangkan coretan kod berikut:
<code class="cpp">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); // Error }
Dalam kod ini, kami mempunyai fungsi templat yang mengambil dua hujah: integer a dan objek Skalar daripada beberapa jenis Dtype. Dalam fungsi utama, kami cuba memanggil func dengan menghantar integer a dan integer 2. Walau bagaimanapun, ini gagal dengan ralat penyusunan:
test.cpp: In function ‘int main()’: test.cpp:32:12: error: no matching function for call to ‘func(int&, int)’ func(a, 2); ^ test.cpp:32:12: note: candidate is: test.cpp:25:6: note: template<class Dtype> void func(int, Scalar<Dtype>) void func(int a, Scalar<Dtype> b){ ^ test.cpp:25:6: note: template argument deduction/substitution failed: test.cpp:32:12: note: mismatched types ‘Scalar<Dtype>’ and ‘int’ func(a, 2);</code>
Mengapa TAD Gagal
Sebab kegagalan ialah TAD tidak boleh menggunakan penukaran yang ditentukan pengguna daripada int kepada Scalar
Atas ialah kandungan terperinci Mengapa Potongan Hujah Templat Gagal dengan Penukaran Ditakrifkan Pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!