Isu Takrifan Semula dengan Enable_if_t Templat Argumen
Dalam kod yang disediakan, percubaan untuk menukar kekangan jenis std::enable_if menggunakan sintaks baharu (typename = std::enable_if_t...) menghasilkan ralat definisi semula. Ini kerana kedua-dua fungsi templat:
template<typename T, typename = std::enable_if_t<std::is_same<int, T>::value>>> void g() { }
dan
template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>>> void g() { }
kedua-duanya daripada jenis templat
Untuk menangani isu ini, adalah perlu untuk mengalih keluar nilai lalai daripada kekangan enable_if_t. Ini menghasilkan kod berikut:
template<typename T, std::enable_if_t<std::is_same<int, T>::value, int>*> void g() { } template<typename T, std::enable_if_t<std::is_same<double, T>::value, int>*> void g() { }
Dalam kes ini, hujah jenis kedua kini ialah penunjuk, yang jenisnya bergantung pada yang pertama. Pengkompil boleh menggantikan dalam jenis T untuk menentukan sama ada terdapat konflik antara kedua-dua templat dan ia akan menyelesaikan bahawa tidak ada.
Atas ialah kandungan terperinci Mengapakah Menggunakan `std::enable_if_t` Dengan Nilai Lalai Menghasilkan Ralat Definisi Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!