Rumah > pembangunan bahagian belakang > C++ > Mengapa C Tidak Dapat Menyimpulkan Argumen Templat dalam Konteks Tidak Boleh Disimpulkan?

Mengapa C Tidak Dapat Menyimpulkan Argumen Templat dalam Konteks Tidak Boleh Disimpulkan?

Barbara Streisand
Lepaskan: 2024-12-26 13:47:10
asal
893 orang telah melayarinya

Why Can't C   Deduce Template Arguments in Non-Deducible Contexts?

Mengapa C Tidak Boleh Menyimpulkan T dalam Konteks Tidak Boleh Dipotong?

Dalam coretan kod yang diberikan, struct templat TMap ditakrifkan dengan jenis bersarang Jenis yang mewakili pengkhususan std::map menggunakan hujah templat T. Walau bagaimanapun, pengkompil gagal untuk menyimpulkan T dalam ujian fungsi.

Konteks Tidak Boleh Ditolak

Ralat berlaku kerana kod memanggil ujian dengan argumen yang mempunyai nama taip jenis TMap::Type&, di mana T tidak dinyatakan secara eksplisit. Keadaan ini dirujuk sebagai konteks tidak boleh disimpulkan.

Kekaburan dalam Inferens Jenis

Dalam konteks tidak boleh disimpulkan, pengkompil ialah tidak dapat membuat kesimpulan hujah templat kerana jenis hujah tidak secara unik menentukan T. Sebagai contoh, pertimbangkan perkara berikut senario:

template <>
struct TMap<SomeType> {
  typedef std::map<double, double> Type;
};

template <>
struct TMap<OtherType> {
  typedef std::map<double, double> Type;
};
Salin selepas log masuk

Dalam kes ini, kedua-dua TMap::Type dan TMap::Type adalah sama dengan std::map. Oleh itu, pengkompil tidak boleh menyimpulkan sama ada T ialah SomeType atau OtherType.

Akibat

Penghadan konteks yang tidak boleh disimpulkan mempunyai implikasi penting:

  • Ia menghalang pengkompil daripada mengkhususkan templat secara tersirat berdasarkan jenis hujah yang dihantar kepada fungsi.
  • Ia memerlukan potongan hujah templat eksplisit atau spesifikasi hujah templat eksplisit apabila memanggil fungsi dengan jenis generik sebagai argumen.

Mitigasi

Untuk mengurangkan had ini, seseorang boleh menggunakan teknik seperti hujah templat templat atau C 20 std::is_same_v untuk menyimpulkan hujah templat secara manual atau menyediakan senarai parameter templat yang eksplisit.

Atas ialah kandungan terperinci Mengapa C Tidak Dapat Menyimpulkan Argumen Templat dalam Konteks Tidak Boleh Disimpulkan?. 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