Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Saya Mendapat Ralat Definisi Semula dengan `enable_if_t` dalam Argumen Templat?

Mengapa Saya Mendapat Ralat Definisi Semula dengan `enable_if_t` dalam Argumen Templat?

Linda Hamilton
Linda Hamiltonasal
2024-11-19 03:45:03862semak imbas

Why Am I Getting a Redefinition Error with `enable_if_t` in Template Arguments?

Ralat Takrifan Semula dalam enable_if_t dalam Argumen Templat

Dalam C , sintaks baharu untuk enable_if menggunakan enable_if_t mengalami ralat definisi semula semasa mengalihkan kod ke sintaks baharu. Kod berikut menunjukkan isu:

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

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

Menyusun dengan GCC (5.2) menghasilkan ralat:

"ralat: takrifan semula 'template void g()' "

Punca Ralat

Ralat timbul kerana kedua-dua fungsi templat f dan g mempunyai jenis templat yang sama void(). Walaupun argumen templat kedua mereka mempunyai nilai lalai yang berbeza, mereka masih mempunyai jenis yang sama.

Penyelesaian

Untuk menyelesaikan isu, kemas kini sintaks untuk menggunakan std:: enable_if_t dengan jenis hujah kedua yang berbeza. Contohnya:

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

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

Pengubahsuaian ini memastikan kedua-dua fungsi templat mempunyai jenis templat yang berbeza dan menghapuskan ralat takrifan semula.

Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat Definisi Semula dengan `enable_if_t` dalam Argumen Templat?. 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