c++ - template function specialization default argument -


  टेम्पलेट & lt; typename T & gt; Void function (T arg1, t min = std :: numeric_limits & lt; T & gt; :: min (), टी अधिकतम = std :: numeric_limits & lt; T & gt; :: max ()) {} टेम्पलेट & lt; & gt; शून्य फ़ंक्शन & lt; int & gt; (int arg1, int min, int max) {} int main (int argc, char * argv []) {function & lt; int & gt; (1); }  

यह वाक्य रचना त्रुटि C2689 और C2059 को :: टोकन पर फ़ंक्शन डिफ़ॉल्ट तर्क पंक्ति पर देता है लेकिन विशेषज्ञता के बिना, यह ठीक कर रही है और अगर मैं डिफ़ॉल्ट तर्क बदलता हूं और फिर भी विशेषज्ञता करता हूं:

  टेम्पलेट & lt; typename T & gt; शून्य फ़ंक्शन (टी एजीआर 1, टी मिनट = टी (0), टी अधिकतम = टी (1)) {} टेम्पलेट & lt; & gt; शून्य फ़ंक्शन & lt; int & gt; (int arg1, int min, int max) {}  

समस्या भी गई

अब अगर मैं इसका उपयोग इस तरह करता हूं: फ़ंक्शन & lt; int & gt; (1,2,3); या फ़ंक्शन & lt; float & gt; (1.0f) ठीक है, इसलिए ऐसा लगता है कि यदि टेम्पलेट फ़ंक्शन विशेष है, तो हमें कॉल करने पर डिफ़ॉल्ट तर्क को फिर से लिखना चाहिए?

लेकिन मेरे दूसरे मामले पर, जहां मैं std :: numeric_limits & lt; T & gt; : .. साथ टी (..) फ़ंक्शन & lt; int & gt; (1) को कॉल करते समय कोई सिंटैक्स त्रुटि नहीं है, ऐसा क्यों है?

< P> (I'am Visual Studio 2010 x64 का प्रयोग कर रहा है)

क्योंकि मूल समस्या बग की वजह से है, अब प्रश्न इसे कैसे हल किया जा सकता है

कोड के साथ कुछ भी गलत नहीं है; Como Online, Intel C ++ 11.1, और g ++ 4.1.2 इसे सफलतापूर्वक संकलित करें।

मुझे लगता है कि यह संकलक में एक बग है मैंने हाल ही में एक संबंधित प्रस्तुत किया है, लेकिन दृश्य सी ++ कंपाइलर के विरुद्ध थोड़ा अलग है।


एक वैकल्पिक हल के रूप में, आप कॉल को लपेट कर सकते हैं:

  टेम्पलेट & lt; typename टी & gt; टी get_limits_min () {वापसी std :: numeric_limits & lt; T & gt; :: min (); } टेम्पलेट & lt; typename T & gt; टी get_limits_max () {वापसी std :: numeric_limits & lt; T & gt; :: max (); } टेम्पलेट & lt; typename T & gt; शून्य फ़ंक्शन (टी एजीआर 1, टी मिनट = मिलन_टाइम्स_मिन & lt; T & gt; (), टी अधिकतम = प्राप्त_मिलाइट_मैक्स & lt; T & gt; ()) {}  

बदसूरत?


मैंने

के जवाब में निम्नलिखित पोस्ट किया है प्राथमिक टेम्पलेट में पैरामीटर होना चाहिए जिसमें डिफ़ॉल्ट तर्क मूल्य है मूलभूत तर्क मान वैश्विक नामस्थान में नहीं एक वर्ग टेम्पलेट के सदस्य फ़ंक्शंस होना चाहिए।

पुन: उत्पन्न करने के लिए निम्नलिखित न्यूनतम कोड है:

  नामस्थान N {template & lt; टिनामनाम टी एंड जीटी; संरचना एस {स्थिर टी जी () {वापसी टी (); }}; } टेम्पलेट & lt; typename T & gt; शून्य एफ (टी = एन :: एस एंड एलटी; टी & gt; :: जी ()) {} टेम्पलेट & lt; & gt; शून्य f & lt; & gt; (int) {} int main () {f & lt; int & gt; (); }  

कंपाइलर निम्न त्रुटियों का उत्सर्जन करता है, दोनों ओर जहां प्राथमिक टेम्पलेट परिभाषित है:

  त्रुटि C2589: '::': अवैध टोकन '::' त्रुटि के सही पक्ष पर सी 2059: सिंटैक्स त्रुटि: '::'  

दिलचस्प बात यह है कि अगर क्लास टेम्प्लेट वैश्विक नामस्थान में है, तो एक और मुद्दा है। निम्न कोड को देखते हुए:

  टेम्पलेट & lt; typename T & gt; संरचना एस {स्थिर टी जी () {वापसी टी (); }}; टेम्पलेट & lt; typename T & gt; शून्य एफ (टी = :: एस & gt; टी & gt; :: जी ()) {} टेम्पलेट & lt; & gt; शून्य f & lt; & gt; (int) {} int main () {f & lt; int & gt; (); }  

कंपाइलर उस रेखा पर निम्नलिखित त्रुटि का उत्सर्जन करता है, जिस पर प्राथमिक टेम्पलेट परिभाषित है:

  त्रुटि C2064: शब्द फ़ंक्शन लेने के लिए मूल्यांकन नहीं करता है 0 बहस  

इन उदाहरणों के दोनों उदाहरण परीक्षण मामलों को अच्छी तरह से बनाई गई सी ++ प्रोग्राम हैं।


Comments

Popular posts from this blog

Eclipse CDT variable colors in editor -

AJAX doesn't send POST query -

wpf - Custom Message Box Advice -