2011-07-26 11 views
9

मैं एक टेम्पलेटेड क्लास बना रहा हूं जो किसी भी इटरेटर के चारों ओर एक रैपर है। मैं ऑपरेटर * इस तरह से कर रही हूँ:फ़ंक्शन की वापसी के लिए Decltype

template <typename T> 
class MyIterator { 
public: 
    //... 
    decltype(*T()) operator*() { 
    //... 
    } 
} 

मैं कक्षा टी के ऑपरेटर * करने के लिए decltype एक मंगलाचरण देते हैं, और यह भी काम करता है, लेकिन टी does not के डिफ़ॉल्ट निर्माता यह अभ्यस्त काम किया है।

क्या फ़ंक्शन/विधि के लौटे प्रकार को खोजने के लिए वैसे भी है?

उत्तर

16

यह वही है std::declval के लिए है:

decltype(*std::declval<T>()) operator*() { /* ... */ } 

अपने कार्यान्वयन प्रदान नहीं करता है std::declval (विजुअल C++ 2010 को शामिल नहीं है), आप आसानी से इसे अपने आप को लिख सकते हैं:

template <typename T> 
typename std::add_rvalue_reference<T>::type declval(); // no definition required 

चूंकि T एक इटरेटर प्रकार है, तो आप std::iterator_traits टेम्पलेट का भी उपयोग कर सकते हैं, जिसके लिए किसी भी C++ 0x suppor की आवश्यकता नहीं है टी:

typename std::iterator_traits<T>::reference operator*() { /* ... */ } 
+0

मेरा कंपाइलर कहता है "घोषणा() का उपयोग नहीं किया जाना चाहिए!" –

+1

आपका कंपाइलर क्या कहता है (और आप किस कंपाइलर का उपयोग कर रहे हैं?) आप _ODR-use_ 'declval' नहीं कर सकते क्योंकि यह परिभाषित नहीं है; आप संदर्भों में केवल "इसका उपयोग" कर सकते हैं जहां इसका मूल्यांकन नहीं किया जाएगा, उदाहरण के लिए 'decltype' में। –

+0

/usr/lib/gcc/x86_64- अज्ञात-linux-gnu/4.6.1/../../../../include/c++/4.6.1/type_traits:1134:7: त्रुटि: स्थैतिक दावा असफल: "घोषणा() का उपयोग नहीं किया जाना चाहिए!" –

संबंधित मुद्दे