2011-10-11 14 views
5

मेरे आवेदन में मुझे अस्थायी डेटा का एक छोटा संग्रह स्टोर करने की आवश्यकता है। इस अस्थायी डेटा में मैं किसी अन्य वर्ग के संदर्भ को संग्रहीत करना चाहता हूं और चूंकि यह एक नलप्टर नहीं हो सकता है, इसलिए मैं एक संदर्भ का उपयोग करता हूं।एक std :: वेक्टर साफ़ करने के लिए एक असाइनमेंट ऑपरेटर की आवश्यकता होती है। क्यूं कर?

डेटा स्टोर करने के लिए वेक्टर का उपयोग करें (मेरे पास बहुत अधिक डेटा नहीं है इसलिए वेक्टर ठीक है)।

वेक्टर भरना, और इसके ऊपर पुनरावृत्ति ठीक काम करता है, लेकिन वेक्टर को साफ़ करने से समस्याएं होती हैं।

class Department 
    { 
    }; 

class Person 
    { 
    public: 
     Person (const Department &dept) 
     : m_dept(dept) 
     , m_salary(1000) 
     {} 
    private: 
     const Department &m_dept; 
     double m_salary; 
    }; 

#include <vector> 

int main() 
{ 
std::vector<Person> persons; 

Department dept1; 
Department dept2; 

persons.push_back (Person(dept1)); 
persons.push_back (Person(dept2)); 

persons.clear(); 
} 

सब कुछ संकलित करता है तथा पिछले बयान को छोड़कर पूरी तरह से काम करता है:

यह कुछ सरल समस्या दिखा कोड है। वेक्टर खाली करने से इस त्रुटि संदेश देता है (दृश्य स्टूडियो 2010):

C:\DevStudio\Vs2010\VC\INCLUDE\xutility(2526) : error C2582: 'operator =' function is unavailable in 'Person' 
     C:\DevStudio\Vs2010\VC\INCLUDE\xutility(2547) : see reference to function template nstantiation '_OutIt std::_Move<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled 
     with 
     [ 
      _OutIt=Person *, 
      _InIt=Person * 
     ] 
     C:\DevStudio\Vs2010\VC\INCLUDE\vector(1207) : see reference to function template instantiation '_OutIt std::_Move<Person*,Person*>(_InIt,_InIt,_OutIt)' being compiled 
     with 
     [ 
      _OutIt=Person *, 
      _InIt=Person * 
     ] 
     C:\DevStudio\Vs2010\VC\INCLUDE\vector(1190) : while compiling class template member function 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Myvec>,std::_Vector_const_iterator<_Myvec>)' 
     with 
     [ 
      _Myvec=std::_Vector_val<Person,std::allocator<Person>>, 
      _Ty=Person 
     ] 
     test.cpp(21) : see reference to class template instantiation 'std::vector<_Ty>' being compiled 
     with 
     [ 
      _Ty=Person 
     ] 

कारण प्रतीत हो रहा है कि एसटीडी के कार्यान्वयन :: वेक्टर :: स्पष्ट कॉल std :: वेक्टर :: मिटा, जो _Move प्रणाली को बुलाती है , जो असाइनमेंट ऑपरेटर की आवश्यकता है।

क्यों नहीं स्पष्ट विधि बस:

  • कॉल वेक्टर
  • शून्य

अजीब बात करने के लिए वेक्टर आकार सेट में सभी तत्वों के लिए नाशक है कि जब मैं std :: vector के बजाय std :: list का उपयोग करें, कोड सही ढंग से संकलित करता है।

यह क्यों है?

क्या अन्य कंप्यूटर्स को भी यह समस्या है?

+1

एक साइड नोट के रूप में, सी ++ में संदर्भ शून्य नहीं हो सकते हैं और फिर से बैठे नहीं जा सकते हैं। जब तक आप दोनों गुणों को नहीं चाहते हैं, आपको उनका उपयोग नहीं करना चाहिए। –

उत्तर

11

किसी भी वेक्टर में रखे गए किसी भी वर्ग को एक प्रति असाइनमेंट ऑपरेटर (या कम से कम एक चाल असाइनमेंट की आवश्यकता होती है) सी ++ 11 में ऑपरेटर)। जब आप वास्तव में त्रुटि प्राप्त करते हैं तो यह केवल कार्यान्वयन के मुद्दे की गुणवत्ता है।

2

क्या आपने वास्तव में स्पष्ट() कॉल पर टिप्पणी की है, और इसे संकलित करने का प्रयास किया है? मुझे पूरा यकीन है (और मेरा कंपाइलर मेरे साथ सहमत है) कि push_back इस कारण है (मौजूदा डेटा की आवश्यक प्रतिलिपि के कारण)

+0

त्रुटि संदेश कहता है कि इसे 'मिटा' में जरूरी है जिसे संभवतः 'स्पष्ट' ('स्पष्ट = मिटाएं (प्रारंभ, अंत) 'से बुलाया जाता है। भले ही असाइनमेंट का उपयोग शायद सब कुछ मिटाने के लिए नहीं किया जाएगा, फिर भी फ़ंक्शन को संकलित करना होगा। असाइनबिलिटी वैसे भी एक कंटेनर आवश्यकता है। - push_back, मुझे कल्पना है, कॉपी कन्स्ट्रक्टर के संदर्भ में लागू किया जा सकता है। – visitor

+0

स्पष्ट कॉल पर टिप्पणी करते समय, सब कुछ पूरी तरह से काम करता है। – Patrick

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

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