Rumah >pembangunan bahagian belakang >C++ >Mengapa saya mendapat ralat definisi semula apabila menggunakan std::enable_if_t dalam hujah templat?

Mengapa saya mendapat ralat definisi semula apabila menggunakan std::enable_if_t dalam hujah templat?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 02:23:141043semak imbas

Why do I get redefinition errors when using std::enable_if_t in template arguments?

Ralat Takrifan Semula Anomali dengan std::enable_if_t dalam Argumen Templat

Dalam C , std::enable_if ialah metafungsi yang membenarkan pengaktifan templat bersyarat berdasarkan kekangan tertentu. Ia baru-baru ini telah digantikan oleh std::enable_if_t yang lebih ringkas. Walau bagaimanapun, apabila cuba mengalihkan kod sedia ada untuk menggunakan sintaks baharu, sesetengah pengguna menghadapi ralat takrifan semula yang tidak dijangka.

Kod Contoh

Pertimbangkan kod berikut yang ditulis menggunakan std:: enable_if:

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

Kod ini berjaya disusun, dengan pengkhususan berasingan untuk int dan berganda. Sekarang, katakan kita mahu menulis semula ini menggunakan sintaks std::enable_if_t:

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

Ralat Tidak Dijangka

Bertentangan dengan jangkaan, kod yang dikemas kini ini gagal untuk disusun, dengan GCC 5.2 pelaporan:

error: redefinition of 'template<class T, class> void g()'
       void g() { }

Penjelasan

Ralat terletak pada fakta bahawa std::enable_if_t mewakili jenis, bukan syarat. Apabila digunakan sebagai hujah templat, ia menentukan kekangan jenis. Dalam kes std::enable_if asal, parameter templat kedua ialah jenis penuding, manakala dalam versi std::enable_if_t, ia menjadi alias jenis. Ini menghasilkan dua hujah templat berbeza dengan jenis yang sama (void()).

Penyelesaian

Untuk mengelakkan kekaburan ini, kita perlu memastikan bahawa parameter templat kedua mewakili kekangan jenis yang unik. Satu cara untuk mencapai ini ialah menggunakan parameter templat tiruan:

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

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

Dalam kes ini, U ialah parameter tiruan yang berfungsi semata-mata untuk membezakan dua hujah templat. Dengan pengubahsuaian ini, kod akan berjaya disusun.

Atas ialah kandungan terperinci Mengapa saya mendapat ralat definisi semula apabila menggunakan std::enable_if_t dalam hujah 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