2012-07-07 16 views
10

यह निम्नलिखित टेम्पलेट फ़ंक्शन के संबंध में this question में कोड के बारे में एक असंबंधित प्रश्न है।त्रुटि: प्रकार 'int &' प्रकार के संदर्भ के अमान्य प्रारंभिक प्रकार 'const int' की अभिव्यक्ति से

template <class T> 
class Object : public Container { 
public: 
    T& object; 

    Object(const T& obj) : object(obj) {} 
}; 

इस कोड है कि निर्माता कहता है:

template <class T> 
void Array::add_element(const T& element) 
{ 
    vec.push_back(new Object<T>(element)); 
} 

इस कोड को ठीक संकलित, लेकिन जैसे ही मैं main में एक पंक्ति जोड़ें के रूप में है कि यह कॉल:

Array array; 
int i = 3; 
array.add_element(i); 

मैं एक कंपाइलर चेतावनी प्राप्त करें: error: invalid initialization of reference of type 'int&' from expression of type 'const int'

इसके बारे में क्या है? मैंने int पास किया। क्या इसे स्वचालित रूप से मेरे लिए const int& में परिवर्तित नहीं किया जाना चाहिए? संकलक शिकायत क्यों कर रहा है?

+6

सुझाव: 'टी एंड वस्तु;' - इसके अलावा, 'स्थिरांक टी एंड obj = nullptr' किसी भी मतलब नहीं है , आप 'nullptr' के संदर्भ को प्रारंभ नहीं कर सकते हैं। – Xeo

+0

यह एक संकेत कैसे है? यह ठीक है कि 'ऑब्जेक्ट' पहले ही घोषित किया गया है। और धन्यवाद, मैं इसे बदल दूंगा। – anthropomorphic

+2

यह एक संकेत है क्योंकि आप एक कॉन्स्ट संदर्भ से एक गैर-कॉन्स्ट संदर्भ प्रारंभ नहीं कर सकते हैं - कॉन्स्ट-शुद्धता 101. – ildjarn

उत्तर

12

obj एक कॉन्स्ट संदर्भ है। object एक गैर-कॉन्स्ट संदर्भ है।

आप किसी कॉन्स्ट संदर्भ से गैर-कॉन्स्ट संदर्भ प्रारंभ नहीं कर सकते हैं, क्योंकि ऐसा करने से पहले स्थान पर कॉन्स्ट संदर्भ होने के उद्देश्य को हराया जाएगा।

यदि आप Object का उदाहरण चाहते हैं तो int को अपने कन्स्ट्रक्टर को पास करने में सक्षम होने के लिए, तो निर्माता को गैर-कॉन्स्ट संदर्भ लेना चाहिए। यदि आप नहीं करते हैं, तो डेटा सदस्य एक कॉन्स्ट संदर्भ होना चाहिए।

किसी भी मामले में, यदि आप डेटा सदस्यों के संदर्भ में ऑब्जेक्ट आवंटित करने के लिए new का उपयोग करते हैं, तो आप अपने लिए परेशानी का संग्रह कर रहे हैं। यह सुनिश्चित करें कि आप Objecti से पहले क्षेत्र से बाहर वैसे भी चला जाता है (या हटाने के लिए सुनिश्चित करें कि Object अपने सदस्य का उपयोग नहीं करता objecti के बाद क्षेत्र से बाहर चला जाता है अपने समस्या है।

+0

उत्कृष्ट जवाब। यह अब काम करता है। – anthropomorphic

8

आप एक आवंटित करने के लिए कोशिश कर रहे हैं एक गैर स्थिरांक संदर्भ के लिए स्थिरांक संदर्भ। इसका मतलब यह है कि आपके वस्तु वर्ग वस्तु की सामग्री को संशोधित कर सकते हैं।

const int myConstNumber = 4; 
Object<int> intObj(myConstNumber); 

intObj.object = 3; // you have indirectly modified the value of myConstNumber 

सी ++ आप ऐसा कर न दें। आप वस्तु की एक प्रतिलिपि बनाने या जोड़ सकते हैं आपकी विशेषता के लिए आधार।

template <class T> 
class Object : public Container { 
public: 
    T object; // valid 

या

template <class T> 
class Object : public Container { 
public: 
    const T& object; // valid 
इस मामले में

आप वस्तु संशोधित नहीं कर सकते

+1

धन्यवाद, आपका उत्तर भी अच्छा है, लेकिन पहली बार आओ-सर्विस, माफ करना =/ – anthropomorphic

+6

यह ठीक है, मैं मदद करने के लिए यहां हूं, कुडोस के लिए नहीं। :) – ilmale

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