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
Linda Hamiltonasal
2024-11-12 10:08:02343semak imbas

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() { }

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() { }

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() { }

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() { }

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!

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