Templat C ++ terkenal karena menghasilkan pesan kesalahan yang panjang dan tidak dapat dibaca. Saya punya ide umum mengapa pesan kesalahan template di C ++ sangat buruk. Pada dasarnya, masalahnya adalah bahwa kesalahan tidak dipicu sampai kompilator menemukan sintaks yang tidak didukung oleh tipe tertentu dalam templat. Sebagai contoh:
template <class T>
void dosomething(T& x) { x += 5; }
Jika T
tidak mendukung +=
operator, kompiler akan menghasilkan pesan kesalahan. Dan jika ini terjadi jauh di dalam perpustakaan di suatu tempat, pesan kesalahan mungkin ribuan baris.
Tapi template C ++ pada dasarnya hanya sebuah mekanisme untuk mengetik bebek waktu kompilasi. Kesalahan template C ++ secara konseptual sangat mirip dengan kesalahan tipe runtime yang mungkin terjadi dalam bahasa dinamis seperti Python. Misalnya, pertimbangkan kode Python berikut:
def dosomething(x):
x.foo()
Di sini, jika x
tidak memiliki foo()
metode, interpreter Python melempar pengecualian, dan menampilkan jejak stack bersama dengan pesan kesalahan yang cukup jelas yang menunjukkan masalah. Bahkan jika kesalahan tidak dipicu sampai penerjemah berada jauh di dalam beberapa fungsi perpustakaan, pesan runtime-error masih belum mendekati seburuk muntah yang tidak terbaca dimuntahkan oleh kompiler C ++ khas. Jadi mengapa kompiler C ++ tidak bisa lebih jelas tentang apa yang salah? Mengapa beberapa pesan kesalahan templat C ++ benar-benar menyebabkan jendela konsol saya bergulir selama lebih dari 5 detik?
clang++
mengedipkan mata).