c++ - Template instantiation error -
मेरे पास टेम्पलेट फ़ंक्शन "तुलना" नीचे वर्णित है।
# include & lt; iostream & gt; नेमस्पेस एसटीडी का उपयोग करना; टेम्पलेट & lt; typename T & gt; शून्य की तुलना (const T & amp; a, const T & amp; b) {cout & lt; & lt; "इनसाइड तुलना" & lt; & lt; endl; } मुख्य () {तुलना ("एए", "बीबी"); तुलना ( "आ", "bbbb"); }
जब मैं एक ही लंबाई की स्ट्रिंग लीटरल के साथ तुलना करना शुरू करता हूं, तो कंपाइलर शिकायत नहीं करता है। जब मैं इसे अलग-अलग लंबाई के शाब्दिक शब्दों के साथ करता हूं, तो यह कहते हैं, "त्रुटि: तुलना करने के लिए कॉल करने के लिए कोई मेल नहीं खाता (const char [3], const char [5])"
वर्ण सरणी के बजाय वर्ण सूचक के साथ तत्काल हो। स्ट्रिंग लीटरल हमेशा पॉइंटर को क्षय नहीं करनी चाहिए?
जैसा कि ग्रेग के जवाब और टिप्पणियों में कहा गया है, दो भिन्न सरणी प्रकार (चूंकि स्ट्रिंग लीटरल हैं) की समस्या है आप फ़ंक्शन को सामान्य प्रकार के लिए छोड़ना चाह सकते हैं, लेकिन इसे चरित्र पॉइंटर और एरे के लिए अधिभार दें, यह अधिक उपयोगी है जब आप उन्हें थोड़ा अलग तरह से व्यवहार करना चाहते हैं।
शून्य तुलना करें Const * a, char const * b) {// कुछ करें, संभवतः strlen ()} टेम्पलेट का प्रयोग करें & lt; int n1, int n2 & gt; शून्य तुलना (चार const (& amp; ए) [एन 1], चार कॉन्स्ट (एंड बी) [एन 2]) {// ...}
यदि आप निर्दिष्ट करना चाहते हैं कि तुलना वर्णों को स्पष्ट रूप से लेना चाहिए, फिर एरे स्वतः रूप से परिवर्तित हो जाएंगे:
तुलना करें & lt; char const * & gt; ("एए", "बीबीबीबी");
दूसरी ओर, शायद दो भिन्न प्रकारों के साथ काम करने के लिए तुलना की जा सकती है? यह अन्य प्रकार के लिए भी उपयोगी हो सकता है, उदा। हो सकता है कि यह f (a)
अगर a.size () & lt; B.size ()
, और f (b)
अन्यथा ( f
ओवरलोडेड के साथ) (टी 1 और टी 2 को नीचे एक ही प्रकार की अनुमति दी जाती है, और यह उपर्युक्त दो के रूप में ओवरलोडिंग के बजाय आपके फ़ंक्शन को बदल देगा।)
टेम्पलेट & lt; typename T1, typename T2 & gt; शून्य तुलना (टी 1 कॉन्स्ट एंड ए, टी 2 कॉन्स्ट एंड बी) {// ...}
Comments
Post a Comment