关于std:C ++ Vector错误消息:

C++ Vector error messages:

此错误消息是因为我正在使用int而不是sizeu调整向量的大小吗?或者因为我必须声明一个复制构造函数?

我用vector_name[pos] = MyClass_Obj来分配元素,而不是用vector_name.push_back(MyClass_Obj)来分配元素。

no appropriate default constructor available:

see reference to function template instantiation 'void
std::_Uninit_def_fill_n<_FwdIt,_Diff,_Tval,_Alloc,Node>(_FwdIt,_Diff,const
_Tval *,_Alloc &,_Valty *,std::_Nonscalar_ptr_iterator_tag)' being compiled

see reference to function template instantiation 'void
std::_Uninitialized_default_fill_n>(_FwdIt,_Diff,const _Tval *,_Alloc &)'
being compiled

while compiling class template member function 'void
std::vector<_Ty>::resize(unsigned int)'

see reference to class template instantiation 'std::vector<_Ty>' being
compiled


存储在vector<>中的对象必须是默认可构造的。你的不是。

1
2
3
4
5
6
7
8
9
class MyClass {
public:
  MyClass() { /* This ctor is required. */ }
};

int main () {
  std::vector<MyClass> vec_name;
  vec_name.resize(10); // or else this will fail.
}


您不应该这样插入。operator[]用于访问,而不是创建。

如果你在vec[pos]那里做pos >= vec.size()你就进入了行为不明确的土地。vec[pos]返回对存储在索引pos中的元素的引用。如果位置上没有元素,则实现可以自由地执行它想要的任何操作。

我希望您的代码能够安静地崩溃和烧掉,而不是给出编译器错误。不过,可能发生的情况是向量实现试图帮助您,它用默认构造的实例填充了size()pos之间的空间(好吧,尝试——这将需要一个默认的构造函数存在)。

简而言之:"我正在使用vector_name[pos]=myclass_obj分配元素"

这是对operator[]的滥用。operator[]只能用于访问存在的元素。它不应该用于添加新元素。实际上,我很惊讶向量实现并没有阻塞它,因为我可以想象它会尝试返回对某个不是该类型实例的对象的引用。