मेरे आवेदन में मुझे अस्थायी डेटा का एक छोटा संग्रह स्टोर करने की आवश्यकता है। इस अस्थायी डेटा में मैं किसी अन्य वर्ग के संदर्भ को संग्रहीत करना चाहता हूं और चूंकि यह एक नलप्टर नहीं हो सकता है, इसलिए मैं एक संदर्भ का उपयोग करता हूं।एक 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 का उपयोग करें, कोड सही ढंग से संकलित करता है।
यह क्यों है?
क्या अन्य कंप्यूटर्स को भी यह समस्या है?
एक साइड नोट के रूप में, सी ++ में संदर्भ शून्य नहीं हो सकते हैं और फिर से बैठे नहीं जा सकते हैं। जब तक आप दोनों गुणों को नहीं चाहते हैं, आपको उनका उपयोग नहीं करना चाहिए। –