2012-01-25 14 views
9

से एक char निकालने पर जीसीसी कंपाइलर त्रुटि मैं स्ट्रीम से एक ही अक्षर को पढ़ने की कोशिश कर रहा हूं। निम्नलिखित कोड के साथ मुझे एक "अस्पष्ट अधिभार" कंपाइलर त्रुटि मिलती है (जीसीसी 4.3.2, and 4.3.4)। मैं क्या गलत कर रहा हूँ?एक अस्थायी धारा

#include <iostream> 
#include <sstream> 

int main() 
{ 
    char c; 
    std::istringstream("a") >> c; 
    return 0; 
} 

टिप्पणी:

  • विजुअल स्टूडियो 2008 त्रुटियों के बिना संकलित
  • अन्य प्रकार (int, double) काम कर रहे हैं
  • अगर मैं पहले एक चर std::istringstream iss("a"); iss >> c बनाने के लिए, संकलक कोई त्रुटि देता है
+0

वास्तव में, अपने तीसरे बुलेट बिंदु में, कि जहां अंत में _not_ एक अस्थायी चर बना रहे है। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट: धन्यवाद, मैंने अंतिम बिंदु को सही किया। –

उत्तर

9

निष्कर्षण ऑपरेट

template<class charT, class traits> 
    basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); 

चूंकि यह गैर const संदर्भ द्वारा अपनी पहली तर्क लेता है, आप एक अस्थायी rvalue वहाँ का उपयोग नहीं कर सकते हैं: या पात्रों के लिए >> एक गैर सदस्य समारोह टेम्पलेट है। इसलिए, आपका कोड इस अधिभार का चयन नहीं कर सकता, केवल विभिन्न सदस्य फ़ंक्शन ओवरलोड, इनमें से कोई भी इस उपयोग से मेल नहीं खाता है।

आपका कोड सी ++ 11 में मान्य है, क्योंकि एक निष्कर्षण ऑपरेटर भी रावल्यू संदर्भ को पहली तर्क के रूप में संदर्भित करता है।

विजुअल स्टूडियो 2008 त्रुटियों के बिना संकलित

कि संकलक के कई अमानक एक्सटेंशन में से एक अस्थायी rvalues ​​const संदर्भ गैर करने के लिए बाध्य होने के लिए अनुमति देने के लिए है।

अन्य प्रकार (int, double)

अधिकांश निष्कर्षण ऑपरेटरों काम कर रहे हैं मौलिक प्रकार के लिए सदस्य काम करता है, जो एक अस्थायी rvalue पर कहा जा सकता है कर रहे हैं।

अगर मैं पहले एक चर std::istringstream iss("a"); iss >> c बनाने के लिए, संकलक कोई त्रुटि देता है

iss एक गैर अस्थायी lvalue है, इसलिए यह एक गैर const संदर्भ के लिए बाध्य किया जा सकता है।

+0

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

+0

@ श्री अनीबिस: मुझे इस कार्यक्रम के लिए चेतावनी नहीं मिली है। मैं 'std :: istringstream और एस एस = std :: istringstream (" एक ") के लिए एक चेतावनी नहीं मिलता है,' या तो –

+0

@ Mr.Anubis: के बाद अपनी टिप्पणी मैं इसे फिर से संकलित कोई चेतावनी के साथ! लेकिन '/ W3' (जो डिफ़ॉल्ट रूप से प्रतीत होता है) से चेतावनी स्तर को बदलने के बाद मुझे ऐसी चेतावनी मिली। –

4

operator>> के लिए हस्ताक्षर एक char पढ़ने

template<class charT, class traits> 
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in,charT& c); 

है भाषा नियमों के अनुसार, एक अस्थायी एक अस्थायी रूप में पहली पैरामीटर के लिए बाध्य नहीं कर सकते हैं एक गैर स्थिरांक संदर्भ के लिए बाध्य नहीं कर सकते।

विजुअल स्टूडियो 2008 इसे एमएस एक्सटेंशन के रूप में अनुमति देता है। बाद के संस्करण आपको चेतावनी देंगे कि इसकी अनुमति नहीं है।

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