Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Penukaran Jenis Tersirat Gagal dalam Potongan Templat?

Mengapa Penukaran Jenis Tersirat Gagal dalam Potongan Templat?

Barbara Streisand
Barbara Streisandasal
2024-10-31 19:31:30231semak imbas

 Why Does Implicit Type Conversion Fail in Template Deduction?

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 objek. Walau bagaimanapun, yang menghairankan, kod tersebut gagal untuk disusun kerana potongan hujah templat/penggantian gagal untuk panggilan pertama ke func(a, 2).

Sebab di sebalik kegagalan ini ialah potongan hujah templat tidak menganggap pengguna- penukaran yang ditentukan. Dalam senario ini, penukaran daripada int kepada Skalar ialah penukaran yang ditentukan pengguna, yang tidak digunakan secara automatik semasa potongan hujah templat.

Untuk menyelesaikan isu ini, terdapat beberapa pilihan:

  • Penukaran Eksplisit di Tapak Pemanggil: Paksa penukaran dengan menyediakan Skalar secara manual objek dengan nilai yang dikehendaki di tapak panggilan:

    <code class="cpp">func(a, Scalar<int>{2}); </code>
  • Panduan Potongan: Tentukan panduan potongan untuk Skalar dan fungsi panggilan:

    <code class="cpp">func(a, Scalar{2}); // C++17 only</code>

    Pendekatan ini bergantung pada panduan potongan lalai, yang mencukupi dalam kes ini.

  • Semerta Eksplisit: Buat seketika templat func untuk jenis yang diingini:

    <code class="cpp">func<int>(a, 2); </code>

    Ini hanya berfungsi jika Scalar::Scalar(T) tidak eksplisit.

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!

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