-1

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

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

没有合适的默认构造函数可用:

请参阅正在编译的函数模板实例化 'void std::_Uninit_def_fill_n<_FwdIt,_Diff,_Tval,_Alloc,Node>(_FwdIt,_Diff,const _Tval *,_Alloc &,_Valty *,std::_Nonscalar_ptr_iterator_tag)' 的引用

请参阅正在编译的函数模板实例化 'void std::_Uninitialized_default_fill_n>(_FwdIt,_Diff,const _Tval *,_Alloc &)' 的参考

编译类模板成员函数 'void std::vector<_Ty>::resize(unsigned int)'

请参阅正在编译的类模板实例化 'std::vector<_Ty>' 的引用

4

2 回答 2

3

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

如果您vec[pos]pos >= vec.size()进入未定义行为领域的地方进行操作。 vec[pos]返回对存储在索引处的元素的引用pos。如果该位置没有元素,则实现可以随意做任何事情。

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

简而言之:“我正在使用 vector_name[pos] = MyClass_Obj 分配元素”

那是滥用operator[]. operator[]应该只用于访问存在的元素。它不应该用于添加新元素。我实际上很惊讶矢量实现并没有因此而窒息,因为我想它会尝试返回对不是该类型实例的东西的引用。

于 2012-05-27T01:25:21.460 回答
3

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

class MyClass {
public:
  MyClass() { /* This ctor is required. */ }
};

int main () {
  std::vector<MyClass> vec_name;
  vec_name.resize(10); // or else this will fail.
}
于 2012-05-27T01:44:37.467 回答