Rumah > pembangunan bahagian belakang > C++ > Mengapa Potongan Hujah Templat Gagal dalam Konteks Tidak Terdeduksi?

Mengapa Potongan Hujah Templat Gagal dalam Konteks Tidak Terdeduksi?

Mary-Kate Olsen
Lepaskan: 2024-11-29 06:29:12
asal
381 orang telah melayarinya

Why Does Template Argument Deduction Fail in Nondeduced Contexts?

Potongan Argumen Templat dan Konteks Tak Terdeduksi

Dalam C , potongan hujah templat membolehkan pengkompil menentukan jenis parameter templat berdasarkan jenis daripada argumen yang dihantar ke fungsi atau kelas templat. Walau bagaimanapun, mekanisme ini mungkin gagal dalam senario tertentu yang melibatkan konteks tidak terdeduksi.

Pertimbangkan coretan kod berikut:

template <class T>
struct S {
    typedef T& type;
};

template <class A>
A temp(S<A>::type a1) {
    return a1;
}

template <class A, class B>
B temp2(S<A>::type a1, B a2) {
    return a1 + a2;
}
Salin selepas log masuk

Di sini, struktur S berfungsi sebagai cara untuk mendapatkan rujukan kepada jenis dipegang oleh parameter templat A. Walau bagaimanapun, apabila cuba memanggil fungsi ini dengan nilai integer, seperti yang ditunjukkan di bawah, pengkompil melaporkan ralat:

int main() {
    char c = 6;
    int d = 7;
    int res = temp(c);
    int res2 = temp2(d, 7);
}
Salin selepas log masuk

Mesej Ralat:

  • Ralat 1: temp(S::type): tidak dapat menyimpulkan hujah templat untuk A
  • Ralat 2: temp2(S::type,B): tidak dapat menyimpulkan hujah templat untuk A

Penjelasan:

Isu ini timbul kerana jenis A digunakan semata-mata dalam konteks yang tidak disimpulkan, yang bermaksud pengkompil tidak boleh membuat kesimpulan daripada hujah diserahkan kepada fungsi. Khususnya, S::type dianggap tidak terdeduksi kerana ia muncul dalam jenis templat bersarang dan tidak berkaitan secara langsung dengan hujah temp atau temp2.

Penyelesaian:

Untuk menyelesaikan isu ini dan mendayakan potongan hujah templat, jenis A mesti dinyatakan dengan jelas semasa memanggil fungsi, seperti yang ditunjukkan di bawah:

temp<char>(c);
Salin selepas log masuk

Spesifikasi eksplisit ini membolehkan pengkompil menentukan jenis A dan berjaya membuat instantiat fungsi templat.

Atas ialah kandungan terperinci Mengapa Potongan Hujah Templat Gagal dalam Konteks Tidak Terdeduksi?. 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