ए vector
अक्सर तत्वों को चारों ओर स्थानांतरित करने की आवश्यकता होती है।जब भी आप push_back()
पर कॉल करते हैं तो वेक्टर को बढ़ने की आवश्यकता होती है, यह स्मृति को स्वयं को संगत रखने के लिए स्मृति को पुन: आवंटित करता है, और सभी मौजूदा तत्वों को नई जगह में प्रतिलिपि बनाता है। अगर आप insert()
या remove()
तत्वों को पर स्थानांतरित करना चाहते हैं तो भी स्थानांतरित किया जाना चाहिए। vector
के लिए यह सब करने में सक्षम होने के लिए तत्वों को कॉपी-असाइन करने योग्य होना चाहिए, जिसका अर्थ है कि वेक्टर में आपके द्वारा संग्रहीत प्रकार में असाइनमेंट ऑपरेटर परिभाषित होना चाहिए।
आम तौर पर, यदि आप कक्षा को परिभाषित करते हैं, तो संकलक आपके लिए उस कक्षा के लिए असाइनमेंट ऑपरेटर उत्पन्न करेगा। हालांकि, ऐसे मामले हैं जब संकलक ऐसा करने में असमर्थ हैं। इन मामलों में से एक यह है कि जब कक्षा में निरंतर सदस्य होते हैं (ध्यान दें कि पॉइंटर्स-टू-कॉन्स ठीक है)।
तो, आपके मामले में, समस्या const string name
है। यह संकलक को operator=()
उत्पन्न करने से रोकता है, जो बदले में vector
संकलन से रोकता है, भले ही आप वास्तव में अपने तत्वों पर असाइनमेंट का उपयोग न करें।
एक समाधान name
गैर-कॉन्स बनाने के लिए है। दूसरा अपना खुद का Student::operator=()
लिखना है, किसी भी तरह से यह समझ में आता है। तीसरा तरीका है, जैसा कि आपने बताया है, ऑब्जेक्ट्स के वेक्टर की बजाय पॉइंटर्स के वेक्टर का उपयोग करने के लिए। लेकिन फिर आपको उनके आवंटन और डी-आवंटन को संभालना होगा।
पीएस दूसरा मामला जब संकलक operator=
उत्पन्न नहीं कर सकता है तब आपकी कक्षा में ऐसे सदस्य होते हैं जो संदर्भ हैं।
यह वीसी 2010 के साथ संकलित और लिंक करने लगता है। क्या आप अपने पर्यावरण के बारे में अधिक जानकारी प्रदान कर सकते हैं? क्या यह एक पूर्ण परीक्षण केस है जो संकलन विफलता को पुन: उत्पन्न करता है? – DRH
@DRH: मैं वीसी 2008 पर हूं, क्षमा करें। और हाँ, यह पूरा परीक्षण मामला है। – Mehrdad
जबकि अन्य परिचालनों के लिए आपको असाइनमेंट ऑपरेटर की आवश्यकता होगी, मैं किसी भी संभावित कारणों के बारे में नहीं सोच सकता कि क्यों 'push_back' की आवश्यकता होगी ... फिर, यह हो सकता है कि कार्यान्वयन' असाइन करने योग्य 'आवश्यकता की जांच करे। –