2011-10-11 20 views
5

Uygulamamda küçük bir geçici veri topladım. Bu geçici veride, başka bir sınıfa bir başvuru kaydetmek istiyorum ve bir nullptr olamayacağı için bir referans kullanıyorum.Bir std :: vektörünün temizlenmesi bir atama işlecine ihtiyaç duyar. Niye ya?

Verileri depolamak için bir vektör kullanılır (çok fazla veriye sahip olmamak böylece vektör iyi durumda).

Vektörün doldurulması ve üzerinde yineleme işlemi düzgün çalışıyor, ancak vektörün temizlenmesi sorun yaratıyor gibi görünüyor.

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(); 
} 

Her şey derler ve son açıklamada HARİÇ mükemmel çalışıyor:

Bu sorunu gösteren bazı basitleştirilmiş bir koddur. Bu hata mesajı vektörü verir silinmesi (Visual Studio 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 
     ] 
nedeni gibi görünüyor

o _Move yöntemini çağıran std uygulanması :: vector :: net çağrılar std :: vector :: silme, atama operatörüne ihtiyacı var gibi görünüyor.

Neden can basitçe temizlemez yöntemi:

  • çağrı
  • sıfır

komik bir şey vektör boyutunu ayarlamak vektör tüm öğeler için yıkıcı olduğunda ben std :: vector yerine std :: list kullanın, kod doğru şekilde derler.

Bu neden?

Diğer derleyiciler de bu sorunu yaşıyor mu?

+1

Bir yan not olarak, C++ içindeki başvurular geçersiz olamaz ve yeniden oturtulmaz. Her iki özelliği de istemediğiniz sürece bunları kullanmamalısınız. –

cevap

11

Bir vektörü yerleştiren herhangi bir sınıf, bir kopya atama işleci gerektirir (veya en azından bir hareket atama C++ işletmecisi 11). Hatayı aldığınızda yalnızca bir uygulama sorunu sorunu.

2

Gerçekten clear() çağrısını yorumladıysanız ve derlemeyi denediniz mi? Oldukça eminim (ve derleyicim benimle aynı fikirde) push_back'in buna neden olduğunu (mevcut verinin gerekli kopyalanması nedeniyle)

+0

Hata mesajı, "temizle" ('clear = delete (begin, end)') denilen silme işleminde gerekli olduğunu söylüyor. Her ne kadar atama muhtemelen her şeyi silmek için kullanılmasa da, işlev hala derlenmelidir. Atanabilirlik zaten bir konteyner gereksinimidir. - push_back, düşünün, kopya kurucusu açısından uygulanabilir. – visitor

+0

Net aramayı yorumlarken her şey mükemmel çalışır. – Patrick

İlgili konular