C ++ şablonları uzun, okunamayan hata mesajları üretme konusunda ünlüdür. C ++ şablonunda hata iletilerinin neden bu kadar kötü olduğu konusunda genel bir fikrim var. Temel olarak sorun, derleyici bir şablonda belirli bir tür tarafından desteklenmeyen sözdizimi ile karşılaşıncaya kadar hatanın tetiklenmemesidir. Örneğin:
template <class T>
void dosomething(T& x) { x += 5; }
Eğer T
desteklemiyorsa +=
operatörü, derleyici bir hata mesajı oluşturur. Ve eğer bu bir yerde bir kütüphanenin derinliklerinde olursa, hata mesajı binlerce satır uzunluğunda olabilir.
Ancak C ++ şablonları aslında sadece derleme zamanı ördek yazma için bir mekanizmadır. Bir C ++ şablon hatası kavramsal olarak Python gibi dinamik bir dilde oluşabilecek bir çalışma zamanı tipine benzer. Örneğin, aşağıdaki Python kodunu göz önünde bulundurun:
def dosomething(x):
x.foo()
Burada, x
bir foo()
yönteme sahip değilse , Python yorumlayıcısı bir istisna atar ve sorunu belirten oldukça açık bir hata mesajı ile birlikte bir yığın izlemesi görüntüler. Hata, yorumlayıcı bazı kütüphane işlevlerinin derinliklerine kadar tetiklenmese bile, çalışma zamanı hata mesajı, tipik bir C ++ derleyicisinin yaydığı okunamayan kusmuk kadar kötü değildir. Peki neden bir C ++ derleyicisi neyin yanlış gittiği konusunda daha net olamıyor? Neden bazı C ++ şablon hata mesajları tam anlamıyla konsol penceremin 5 saniyeden fazla bir süre boyunca kaymasına neden oluyor?
clang++
göz kırpması).