Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Tidak Boleh Menggunakan Terapung sebagai Parameter Templat Bukan Jenis dalam C ?

Mengapa Saya Tidak Boleh Menggunakan Terapung sebagai Parameter Templat Bukan Jenis dalam C ?

Linda Hamilton
Lepaskan: 2024-12-21 15:49:09
asal
741 orang telah melayarinya

Why Can't I Use Floats as Non-Type Template Parameters in C  ?

Memahami Sekatan Parameter Templat: Mengapa Nilai Terapung Dilarang

Dalam C , apabila mentakrifkan kelas generik dengan parameter templat, sekatan tertentu dikenakan. Satu sekatan sedemikian melibatkan ketidakupayaan untuk menggunakan nilai apungan sebagai parameter templat bukan jenis. Ini menjadi jelas apabila cuba menyusun kod seperti berikut:

template <class T, T defaultValue>
class GenericClass
{
    // ...
};

int main()
{
    GenericClass<float, 4.6f> gcFloat;  // Error
}
Salin selepas log masuk

Mesej Ralat:

'float' is not a valid type for a template constant parameter
Invalid type in declaration before ';' token
Salin selepas log masuk

Penalaran:

Menurut piawaian C 11, argumen templat bukan jenis mesti mematuhi keperluan khusus. Untuk parameter templat bukan jenis jenis kamiran atau penghitungan, hanya ungkapan pemalar yang ditukar daripada jenis yang sama dibenarkan. Nilai apungan tidak memenuhi keperluan ini, kerana ia tidak boleh diwakili dengan tepat dalam ingatan.

Penjelasan Teknikal:

Menggunakan nilai apungan sebagai hujah templat boleh membawa kepada tingkah laku yang tidak konsisten. Sebagai contoh, pertimbangkan perkara berikut:

func<1/3.f>();
func<2/6.f>();
Salin selepas log masuk

Walaupun kami berhasrat untuk memanggil fungsi yang sama dua kali, perwakilan titik terapung bagi kedua-dua pengiraan mungkin tidak sama. Ini boleh membawa kepada hasil yang berbeza, mengalahkan tujuan menggunakan hujah templat.

Pendekatan Alternatif:

Untuk mewakili nilai titik terapung sebagai hujah templat, pertimbangkan untuk menggunakan C 11's ungkapan malar (constexpr). Anda boleh mencipta ungkapan lanjutan yang mengira pengangka dan penyebut nilai apungan pada masa penyusunan dan menghantarnya sebagai hujah integer yang berasingan. Selain itu, tentukan ambang untuk memastikan nilai titik terapung yang berdekatan antara satu sama lain menghasilkan pengangka dan penyebut yang sama.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Terapung sebagai Parameter Templat Bukan Jenis dalam C ?. 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