Dans mon application, j'ai besoin de stocker une petite collection de données temporaires. Dans ces données temporaires, je veux stocker une référence à une autre classe et comme il ne peut pas être un nullptr, j'utilise une référence.Effacer un fichier std :: vector nécessite un opérateur d'affectation. Pourquoi?
Utilise un vecteur pour stocker les données (je n'ai pas trop de données donc le vecteur est bon).
Remplir le vecteur, et itérer par dessus fonctionne correctement, mais effacer le vecteur semble poser problème.
C'est un code simplifié montrant le problème:
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();
}
Tout compile et fonctionne parfaitement sauf la dernière déclaration. Effacement du vecteur donne ce message d'erreur (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
]
La raison semble être que la mise en œuvre de std :: vector :: appels clairs std :: vector :: erase, qui appelle la méthode _move , qui semble avoir besoin de l'opérateur d'affectation.
Pourquoi ne peut pas la méthode claire simplement:
- appel du destructor pour tous les éléments du vecteur
- définir la taille du vecteur à zéro
Le plus drôle est que quand je utilisez std :: list au lieu de std :: vector, le code se compile correctement.
Pourquoi est-ce?
Est-ce que d'autres compilateurs ont aussi ce problème?
En note, les références en C++ ne peuvent pas être nulles et ne peuvent pas être réassemblées. Sauf si vous voulez les deux propriétés, vous ne devriez pas les utiliser. –