Mengapa Penukaran Jenis Tersirat Gagal dalam Potongan Templat?

Barbara Streisand
Lepaskan: 2024-10-31 19:31:30
asal
231 orang telah melayarinya

 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;
}
Salin selepas log masuk

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>
    Salin selepas log masuk
  • Panduan Potongan: Tentukan panduan potongan untuk Skalar dan fungsi panggilan:

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

    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>
    Salin selepas log masuk

    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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!