Rumah > pembangunan bahagian belakang > C++ > Mengapakah Menggunakan `enable_if_t` dalam Argumen Templat Membawa kepada Ralat Definisi Semula?

Mengapakah Menggunakan `enable_if_t` dalam Argumen Templat Membawa kepada Ralat Definisi Semula?

Linda Hamilton
Lepaskan: 2024-11-12 10:08:02
asal
342 orang telah melayarinya

Why Does Using `enable_if_t` in Template Arguments Lead to Redefinition Errors?

Mengapa enable_if_t dalam Argumen Templat Menyebabkan Ralat Takrif Semula

Dalam C , std::enable_if digunakan untuk pemilihan jenis bersyarat dalam argumen templat. Apabila menggunakan nama taip sintaks yang lebih baharu std::enable_if_t<...> sebagai ganti nama taip std::enable_if<...>::type*, pengkompil mungkin menimbulkan ralat takrifan semula.

Untuk memahami sebabnya, pertimbangkan kod berikut:

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Salin selepas log masuk

Ini kod mengisytiharkan dua templat yang membebankan f berdasarkan sama ada T adalah int atau berganda. Walau bagaimanapun, apabila kod dikemas kini untuk menggunakan std::enable_if_t, ia menyebabkan ralat definisi semula:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Salin selepas log masuk

Sebab ralat ialah walaupun nilai lalai untuk argumen templat kedua adalah berbeza, templat masih daripada jenis yang sama, templatvoid(). Ini bersamaan dengan mempunyai dua fungsi cetak(rentetan, int) dengan nilai int lalai yang berbeza, yang tidak sah untuk lebihan muatan.

Untuk menyelesaikan isu, alih keluar fasal enable_if dalam argumen templat dan gantikan nama taip dengan kelas:

template<class T, class U /* = std::enable_if_t<std::is_same<int, T>::value> */>
void g() { }

template<class T, class U /* = std::enable_if_t<std::is_same<double, T>::value> */>
void g() { }
Salin selepas log masuk

Sebagai alternatif, anda boleh menentukan jenis lain untuk hujah templat kedua:

template<class T, std::enable_if_t<std::is_same<int, T>::value, int> = nullptr>
void g() { }

template<class T, std::enable_if_t<std::is_same<double, T>::value, int> = nullptr>
void g() { }
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah Menggunakan `enable_if_t` dalam Argumen Templat Membawa kepada Ralat Definisi Semula?. 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