2011-04-15 9 views
6

this question में, पूछताछकर्ता के पास निम्न कार्य है:विजुअल स्टूडियो 2008/2010 में टाइपनाम _not_ क्यों आवश्यक है?

template<typename ITER> 
bool nextPermutation(ITER start, ITER end) 
{ 
    return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category()); 
} 

typename से पहले typename की आवश्यकता क्यों नहीं है? मैंने सोचा था कि टेम्पलेट के नेस्टेड प्रकारों के लिए इसकी आवश्यकता थी, अगर टेम्पलेट टेम्पलेट पैरामीटर पर निर्भर है? जीसीसी मेरे विचार का समर्थन करता प्रतीत होता है, क्योंकि यह typename और 4.5.1 दोनों के तहत संकलित नहीं करता है, जो typename की मांग करता है। फिर भी, यह अभी भी विजुअल स्टूडियो 2008 और 2010 दोनों के तहत ठीक है। Xzx29 क्या यह सिर्फ एक और दृश्य स्टूडियो एक्सटेंशन/बग है जिसे मैं नहीं जानता?
या क्या यह वास्तव में यह संभव है कि iterator_category या तो एक प्रकार या फ़ंक्शन है, क्योंकि उसके बाद कोष्ठक () की एक जोड़ी है? (@ डेडजीएम के संदेश starting here देखें।) तो क्या यह वास्तव में जीसीसी में एक बग है?

+0

आपके द्वारा सूचीबद्ध (कन्स्ट्रक्टर और फ़ंक्शन) विकल्पों के अतिरिक्त, 'iterator_category' ऑपरेटर() को परिभाषित करने वाले प्रकार के एक स्थिर सदस्य चर हो सकता है। – Sjoerd

+0

@Sjoerd: या एक फ़ंक्शन पॉइंटर। – sbi

उत्तर

6

एमएसवीसी देर से पार्सिंग योजना को लागू नहीं करता है? ऐसी योजना में, संकलक typename पर निर्भर नहीं है। यह सिर्फ टेम्पलेट परिभाषा के ब्रेसिज़ के बीच सभी टोकन स्टोर करता है, और जब टेम्पलेट को तुरंत चालू किया जाता है, तो यह उन टोकन को पार करता है। चूंकि यह जानता है कि क्या है और कोई प्रकार नहीं है, यह typename के बिना काम करेगा।

लेकिन यदि संकलक टेम्पलेट को तुरंत चालू करते समय संकलक typename को निदान नहीं करता है, तो यह गैर-अनुरूप है।

या यह वास्तव में यह समझना संभव है कि iterator_category या तो एक प्रकार या फ़ंक्शन है क्योंकि इसके बाद कोष्ठक() की एक जोड़ी है?

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

FWIW, भाषा स्तर पर iterator_category के बारे में कुछ भी कम करना संभव नहीं है।

+0

ध्यान दें कि आवश्यक निदान केवल एक चेतावनी होने की अनुमति है। इसलिए जब तक संकलक कम से कम एक चेतावनी जारी करता है, तब तक इसे "ठीक से संकलित करने" की अनुमति है। दूसरा, डिफ़ॉल्ट रूप से उस चेतावनी को बंद कर दिया जा सकता है - मुझे पता है कि सभी कंपाइलर्स को सी ++ मानक का पालन करने के लिए एक झंडा या विकल्प मौजूद होना आवश्यक है: एक कंपाइलर को अपग्रेड करते समय, अधिकांश ग्राहक नई चेतावनियां/त्रुटियां नहीं चाहते हैं उनके पुराने कोड के लिए, पिछली संगतता कंपाइलर लेखकों को अतिरिक्त विकल्पों के पीछे नई त्रुटियों को छिपाने के लिए मजबूर करती है। – Sjoerd

+0

@Sjoerd: मानक हमेशा केवल "निदान" की बात करता है। यह त्रुटियां या चेतावनियां हो सकती हैं, या तो ठीक होगी। – sbi

+0

@ एसबीआई मुझे यकीन है कि आप और जोहान्स जानते हैं कि, लेकिन यह सामान्य ज्ञान नहीं है। – Sjoerd

11

विज़ुअल सी ++ अच्छी तरह से ज्ञात नहीं है (पूरी तरह से) दो चरण लुकअप का समर्थन करता है, जो कि पहले स्थान पर typename क्यों आवश्यक है इसका अंतर्निहित कारण है। यदि कंपाइलर इसका पूरी तरह से समर्थन नहीं करता है, तो यह तत्काल होने से पहले टेम्पलेट को पूरी तरह से पार्स नहीं कर सकता है, जिसके द्वारा यह "जानता है" कि std::iterator_traits<ITER>::iterator_category एक प्रकार है। जाहिर है, यह कमी वीसी 10 तक फैली हुई है।

जब typename की बात आती है, तो मैं किसी भी दिन वीसी पर जीसीसी पर भरोसा करता हूं।

+0

पूरी तरह से पूरा जवाब है, लेकिन मैं @ जोहान्स का जवाब ले रहा हूं, क्योंकि यह देर से पार्सिंग चीज़ पर थोड़ा और बताता है। +1 हालांकि। :) – Xeo