在我的应用程序中,我需要存储一小部分临时数据。在这个临时数据中,我想存储对另一个类的引用,因为它不能是nullptr,我使用引用。
使用向量来存储数据(我没有太多数据,所以矢量很好)。
填充矢量,并迭代它可以正常工作,但清除矢量似乎会产生问题。
这是一些显示问题的简化代码:
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();
}
除了最后一个声明之外,所有内容都能完美地编译和运行。清除向量会显示此错误消息(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
]
原因似乎是std :: vector :: clear的实现调用了std :: vector :: erase,它调用_Move方法,这似乎需要赋值赋值运算符。
为什么不能简单明确方法:
有趣的是,当我使用std :: list而不是std :: vector时,代码会正确编译。
为什么会这样?
其他编译器也有这个问题吗?
答案 0 :(得分:11)
放入向量中的任何类都需要一个复制赋值运算符(或者至少是C ++ 11中的一个移动赋值运算符)。当你真正得到错误时,这只是一个实施质量问题。
答案 1 :(得分:2)
你真的注释掉了clear()调用,并尝试编译它吗?我非常肯定(我的编译器同意我的观点)push_back导致这种情况(由于需要复制现有数据)