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
Lepaskan: 2024-11-27 02:23:14
asal
975 orang telah melayarinya

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() { }
Salin selepas log masuk

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() { }
Salin selepas log masuk

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() { }
Salin selepas log masuk

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() { }
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan