Kegagalan Potongan Argumen Templat: Memahami Konteks Tidak Terdeduksi
Dalam kod anda, anda telah menentukan dua fungsi (temp dan temp2) yang bertujuan untuk menyimpulkan hujah templat berdasarkan jenis parameter. Walau bagaimanapun, anda menghadapi ralat pengkompil yang menyatakan bahawa ia tidak dapat menyimpulkan hujah ini.
Isu ini berpunca daripada penggunaan kata kunci nama taip dalam definisi fungsi:
// Example 1 template <class A> A temp(typename S<A>::type a1) // Example 2 template <class A, class B> B temp2(typename S<A>::type a1, B a2)
Apabila menggunakan parameter templat templat , nama taip diperlukan untuk merujuk kepada nama bergantung dalam kelas templat. Walau bagaimanapun, ini tidak berlaku dalam konteks fungsi anda, di mana S::type hanyalah jenis tidak bergantung.
Dalam C , potongan hujah templat berlaku apabila parameter templat digunakan dalam konteks yang menentukan jenisnya. Walau bagaimanapun, dalam keadaan ini, parameter templat A digunakan dalam konteks tidak terdeduksi, kerana ia hanya muncul dalam pengisytiharan jenis rujukan:
typedef typename T& type;
Akibatnya, pengkompil tidak boleh menyimpulkan hujah templat daripada panggilan fungsi. Untuk menyelesaikan isu ini, anda perlu menyatakan hujah templat secara eksplisit apabila memanggil fungsi ini:
temp<char>(c);
Dengan memberikan hujah eksplisit, pengkompil dapat membuat instantiate templat dengan jenis yang sesuai dengan betul.
Atas ialah kandungan terperinci Mengapa Potongan Hujah Templat C Saya Gagal dalam Konteks Tidak Terdeduksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!