2011-06-07 8 views
7

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

#include<iostream> 

template<typename T> 
class XYZ 
{ 
    private: 
    T & ref; 
    public: 
    XYZ(T & arg):ref(arg) 
    { 
    } 
}; 
class temp 
{ 
    int x; 
    public: 
    temp():x(34) 
    { 
    } 
}; 
template<typename T> 
void fun(T & arg) 
{ 
} 
int main() 
{ 
    XYZ<temp> abc(temp()); 
    fun(temp()); //This is a compilation error in gcc while the above code is perfectly valid. 
} 

ऊपर कोड भले ही XYZ निर्माता गैर स्थिरांक संदर्भ के रूप में तर्क लेता में, यह ठीक संकलित मज़ा समारोह को संकलित करने में विफल रहता है, जबकि। क्या यह G ++ कंपाइलर या सी ++ मानक के लिए विशिष्ट है इसके बारे में कुछ कहना है?

संपादित करें:

g ++ -v यह देता है।

जीसीसी संस्करण 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

+0

आप जी का कौन सा संस्करण ++ आप उपयोग कर रहे निर्दिष्ट करना चाहिए: अपने कार्य टेम्पलेट के रूप में परिभाषित करते हैं। – Gabe

उत्तर

12
XYZ<temp> abc(temp()); 

यह कम्पाइल, क्योंकि यह एक चर घोषणा नहीं है। मुझे यकीन है कि आपको लगता है कि यह एक परिवर्तनीय घोषणा है जब तथ्य यह है कि यह फ़ंक्शन घोषणा है। फ़ंक्शन का नाम abc है; फ़ंक्शन XYZ<temp> प्रकार का ऑब्जेक्ट देता है और एक एकल (अनामित) तर्क लेता है जो बदले में फ़ंक्शन लौटने वाला प्रकार temp और कोई तर्क नहीं लेता है। क्योंकि temp() एक अस्थायी वस्तु और एक अस्थायी वस्तु बनाता है नहीं कर सकते

और fun(temp()) संकलन नहीं करता है: विस्तार विवरण के लिए इन विषयों को देखें गैर-कॉन्स्ट संदर्भ के लिए बाध्य होना चाहिए।

तो ठीक है:

template<typename T> 
void fun(const T & arg) //note the `const` 
{ 
} 
+1

नवाज, आप स्पॉट पर हैं। जब मैंने सदस्यफन नामक एक और सदस्य फ़ंक्शन जोड़ा और एबीसी का उपयोग करके कॉल करने का प्रयास किया, तो मुझे निम्न त्रुटि मिली "temp.cpp: 41: 8: त्रुटि: 'abc' में सदस्य 'सदस्यफन' के लिए अनुरोध, जो गैर-वर्ग प्रकार का है ' एक्सवाईजेड (अस्थायी (*)())। " – chappar

+0

@ चप्पार: बिल्कुल। 'abc' प्रकार 'XYZ ' का ऑब्जेक्ट नहीं है। यही कारण है कि आप 'abc' का उपयोग करके 'XYZ ' के किसी भी सदस्य फ़ंक्शन को कॉल नहीं कर सकते हैं। – Nawaz

5

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

और

XYZ<temp> abc(temp()); 

बस अभी तक सबसे अप्रिय पार्स का एक और उदाहरण है।

+2

वह आधे प्रश्न का उत्तर देता है। – Beta

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

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