C ++ टेम्पलेट लंबे, अपठनीय त्रुटि संदेश उत्पन्न करने के लिए कुख्यात हैं। मुझे एक सामान्य विचार है कि C ++ में टेम्प्लेट त्रुटि संदेश इतने बुरे क्यों हैं। अनिवार्य रूप से, समस्या यह है कि त्रुटि तब तक ट्रिगर नहीं होती है जब तक कि कंपाइलर एक टेम्पलेट में एक निश्चित प्रकार द्वारा समर्थित सिंटैक्स का सामना नहीं करता है। उदाहरण के लिए:
template <class T>
void dosomething(T& x) { x += 5; }
यदि ऑपरेटर का T
समर्थन नहीं करता है +=
, तो संकलक एक त्रुटि संदेश उत्पन्न करेगा। और अगर यह कहीं एक पुस्तकालय के भीतर गहरा होता है, तो त्रुटि संदेश हजारों पंक्तियों का हो सकता है।
लेकिन C ++ टेम्प्लेट अनिवार्य रूप से संकलन-समय बतख टाइपिंग के लिए सिर्फ एक तंत्र है। C ++ टेम्पलेट त्रुटि अवधारणात्मक रूप से एक रनटाइम प्रकार त्रुटि के समान है जो कि पायथन जैसी गतिशील भाषा में हो सकती है। उदाहरण के लिए, निम्नलिखित पायथन कोड पर विचार करें:
def dosomething(x):
x.foo()
यहाँ, यदि x
कोई foo()
विधि नहीं है , तो पायथन दुभाषिया एक अपवाद फेंकता है, और समस्या का संकेत करने वाले एक बहुत स्पष्ट त्रुटि संदेश के साथ एक स्टैक ट्रेस प्रदर्शित करता है। भले ही त्रुटि तब तक न हो, जब तक कि इंटरप्रिटर कुछ लाइब्रेरी फ़ंक्शन के अंदर गहरा हो, रनटाइम-एरर मैसेज अभी भी कहीं भी पास में नहीं है क्योंकि एक विशिष्ट C ++ कंपाइलर द्वारा पढ़े गए अपठनीय उल्टी के रूप में बुरा है। तो जो गलत हुआ उसके बारे में C ++ कंपाइलर अधिक स्पष्ट क्यों नहीं हो सकता है? कुछ C ++ टेम्पलेट त्रुटि संदेश शाब्दिक रूप से मेरे कंसोल विंडो को 5 सेकंड के लिए स्क्रॉल करने का कारण क्यों बनते हैं?
clang++
विंक विंक)।