2009-01-15 9 views
7

मैं http://code.google.com/p/enhsim से कोड की निम्न पंक्ति को संकलित करना चाहते हैं:किसी ऑब्जेक्ट को संदर्भ में परिवर्तित नहीं किया जा सकता है?

enh::eout << enh::setw(26); 

जीसीसी निम्न त्रुटि देता है:

error: no match for 'operator<<' in 'enh::eout << enh::setw(26)' 

लेकिन EnhSimOutput वर्ग (जिनमें से enh::eout एक उदाहरण है) की घोषणा करता है:

EnhSimOutput& operator<< (setw& p); 

यह समस्या दूर हो जाती है अगर मैं ऑपरेशन के एक संस्करण को लागू करता हूं जो टी स्वीकार करता है वह मान द्वारा आपत्ति:

enh::setw wValue(26); 
enh::eout << wValue; 

मेरा प्रश्न यह है:: क्यों जीसीसी के "द्वारा-संदर्भ" संस्करण का चयन नहीं करता

EnhSimOutput& operator<< (setw p); 

या अगर मैं एक स्थानीय, यानी के रूप में enh::setw वस्तु बनाने ऑपरेटर के साथ शुरू करने के लिए?

डेवलपर्स जिन्होंने इस कोड को स्पष्ट रूप से संकलित किया है, फिर भी डिफ़ॉल्ट जीसीसी इसे करने से इंकार कर देता है। किसी स्थानीय चर के रूप में अलग-अलग घोषित ऑब्जेक्ट और स्थानीय निर्मित इनलाइन के बीच कोई अंतर क्यों है?

उत्तर

13

कोशिश मूल्य enh::setw(26); एक rvalue है। दरअसल, इस तरह के अस्थायी हैं। रावलों में विशेष गुण होते हैं। उनमें से एक यह है कि उनका पता नहीं लिया जा सकता है (&enh::setw(26); अवैध है), और वे आम तौर पर गैर-कॉन्स (कुछ अस्थायी गैर-कॉन्स के संदर्भों से जुड़ सकते हैं, लेकिन इन्हें विशेष नियमों से गुजरना पड़ सकता है) : अस्थायी वस्तुओं पर सदस्य कार्य को कॉल करना और गैर-कॉन्स के संदर्भ में अपवाद ऑब्जेक्ट्स को पकड़ना। बाद के मामले में, अस्थायी भी lvalue है)। lvalues ​​ है कि वस्तुओं को निरूपित (कि बारी में एक मूल्य की दुकान कर सकते हैं) या काम करता है, और rvalues ​​ जो मूल्यों एक वस्तु से बाहर पढ़ने के लिए या temporaries द्वारा प्रतिनिधित्व का प्रतिनिधित्व करने के लिए हैं, अंक:

भाव के दो प्रकार के होते हैं शाब्दिक और गणक स्थिरांक। सी ++ 03 में, ऐसे मानों को ऐसे फ़ंक्शन पर पास करने में सक्षम होने के लिए जो संदर्भ द्वारा इसके मान को स्वीकार करता है, एक नियम है कि उन्हें संदर्भ-से-कॉन्स्ट द्वारा स्वीकार किया जा सकता है: setw const& p इसे स्वीकार करेगा। यही कारण है, अगर आप इस तरह अपने ऑपरेटर की घोषणा करने के लिए होगा:

EnhSimOutput& operator<< (setw const& p); 

कि थोड़ा दुर्भाग्यपूर्ण है, क्योंकि आप लगातार lvalues ​​और गैर स्थिरांक (आप ढेर उदाहरण के लिए const enh::setw e(26); के प्रयोग पर बनाई गई वस्तुओं) को स्पष्ट नहीं कर सकते हैं या कॉन्स रावल्यूज़ (जैसे enh::setw(26); जो एक गैर-कॉन्स अस्थायी है)। साथ ही, यदि आप इसके द्वारा जाते हैं, तो पैरामीटर को गैर-कॉन्स्ट सदस्य फ़ंक्शन नहीं कहा जा सकता है, क्योंकि यह संदर्भ-से-कॉन्स्ट है। इसी कारण से, सी ++ 1x, अगला सी ++ संस्करण, एक नया प्रकार का संदर्भ प्रस्तुत करता है, तथाकथित रावल-संदर्भ जो इसे हल करता है।


माइक्रोसॉफ्ट विज़ुअल सी ++ संकलक गैर स्थिरांक के लिए संदर्भ के लिए rvalues ​​बांधता है, लेकिन एक चेतावनी देता है जब कि (आप कम से कम चेतावनी स्तर 4 उपयोग करने के लिए यह दिखाने के लिए है) कर रहा। यह दुर्भाग्यपूर्ण है, क्योंकि मानक अनुपालन में अधिक सख्त होने वाले अन्य कंपाइलरों को पोर्ट करते समय समस्याएं बढ़ती हैं।

+0

ऑपरेटर को एक कॉन्स्ट संदर्भ में बदलना समस्या को गहराई से हल करता है। राजस्व के बारे में जानकारी के लिए धन्यवाद। मुझे नहीं पता कि कोड किसी और के लिए क्यों संकलित किया गया है। परियोजना विंडोज के लिए है ... शायद वे सभी एक * खांसी * गैर संकलन कंपाइलर का उपयोग कर रहे हैं। कोई जानकारी नहीं। –

+0

litb: मुझे लगता है कि आपके वाक्य में "संदर्भ-से-आधार" का अर्थ है "इसके अलावा, यदि आप इसके द्वारा जाते हैं, तो पैरामीटर को गैर-कॉन्स्ट सदस्य फ़ंक्शन नहीं कहा जा सकता है, क्योंकि यह संदर्भ-से-गैर-कॉन्स्टोन है। " –

+0

मैट: एमएस विजुअल सी ++ के पुराने संस्करण गलत तरीके से अस्थायी रूप से अस्थायी रूप से बाध्य करने के लिए बाध्य करेंगे। मुझे लगता है कि यह एमएसवीसी ++ 2005 में तय किया गया था। –

3

मेरा अनुमान है कि EnhSimOutput& operator<< (setw& p); गैर-कॉन्स्ट संदर्भ द्वारा गुजरता है, लेकिन मान 26 इस अर्थ में "स्थिर" है कि इसे संशोधित नहीं किया जा सकता है। EnhSimOutput& operator<< (const setw& p);

करने के लिए इसे स्थापित करने का प्रयास करें या

int nNumber = 26; 
enh::eout << enh::setw(nNumber); 
+0

-1, क्योंकि इस मुद्दे के साथ 26 के साथ कोई शाब्दिक नहीं है। समस्या यह है कि 'enh :: setw (संख्या)' एक अस्थायी है, और इसलिए गैर-कॉन्स्ट संदर्भ के लिए बाध्य नहीं किया जा सकता है। –

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

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