Dalam C , hujah templat lalai hanya dibenarkan pada templat kelas tetapi tidak pada templat fungsi. Sekatan ini mungkin kelihatan mengejutkan, tetapi terdapat beberapa sebab di sebaliknya.
Argumen templat lalai membenarkan templat kelas memberikan nilai lalai untuk parameter tertentu. Ini boleh berguna apabila nilai lalai tidak mungkin berubah untuk kebanyakan contoh templat. Sebagai contoh, templat kelas untuk algoritma pengisihan boleh mempunyai argumen templat lalai untuk fungsi perbandingan yang digunakan dalam pengisihan.
Walau bagaimanapun, argumen templat lalai tidak dibenarkan untuk fungsi templat kerana ia akan memperkenalkan kekaburan. Pertimbangkan contoh hipotesis berikut:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
Dalam contoh ini, tidak jelas sama ada T ialah jenis lalai untuk fungsi mymember atau untuk templat my_class itu sendiri. Kekaburan ini boleh membawa kepada ralat halus dalam kod.
Sebelum C 11, larangan argumen templat lalai untuk templat fungsi merupakan pengehadan yang ketara. Walau bagaimanapun, C 11 memperkenalkan ciri baharu yang dipanggil "jenis alias" yang membolehkan kami menentukan alias untuk jenis. Ini menyediakan penyelesaian untuk kekurangan argumen templat lalai untuk templat fungsi. Sebagai contoh, contoh di atas boleh ditulis semula seperti berikut:
<code class="cpp">struct my_class { typedef int default_type; template<class T = default_type> void mymember(T* vec) { // ... } };</code>
Walaupun jenis alias tidak semudah hujah templat lalai, ia menyediakan fungsi yang serupa dan membolehkan kami mengatasi batasan piawaian C semasa .
Dalam laporan kecacatan, Bjarne Stroustrup, pereka asal C , menyatakan pandangannya tentang larangan argumen templat lalai untuk templat fungsi:
Larangan hujah templat lalai untuk templat fungsi ialah peninggalan yang salah lahir pada masa di mana fungsi berdiri bebas dianggap sebagai warga kelas kedua dan memerlukan semua hujah templat disimpulkan daripada hujah fungsi dan bukannya ditentukan.
Atas ialah kandungan terperinci Mengapakah Argumen Templat Lalai Terhad kepada Templat Kelas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!