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, templat
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!