std :: vector :: erase(item)需要为项目定义的分配操作员
std::vector::erase(item) needs assignment operator to be defined for item?
我有一个不定定义 operator=
的类C
。我正在尝试使用这样的向量:std::vector<std::pair<C,D>> vec;
。现在,我的问题是我完成后无法删除这对。编译器抱怨C
缺少operator=
。我可以没有一个没有该操作员的班级的向量吗?我该如何解决?我无法将分配添加到C
。这是我遇到的错误:
error C2582: 'operator =' function is unavailable in 'C' C:...includeutility 196 1 my-lib
这是我的代码:
void Remove(const C& c)
{
auto i = cs_.begin();
while( i != cs_.end()) {
if (i->first == c) {
cs_.erase(i); // this is the problem
break;
}
i++;
}
}
其中 cs_
是:
std::vector<std::pair<C,D>> cs_;
原因是,如果擦除与std::vector::end()
不同的位置,则擦除将重新分配您的对象。重新分配的含义是复制。
请注意,不可复制类型的向量仅部分可用。在我们拥有emplace()
(PRE-C 11)之前,这甚至是不可能的。如果您的班级可复制,为什么不定义作业操作员?
解决方法可以是smartpointers(或普通指针)的向量,例如 std::vector<std::unique_ptr<C>>
是正确的。该标准要求向量或Deque中的项目 emaveAssignable 如果erase
工作。
通常,向量和脱口机需要能够从任意位置擦除。当他们这样做时,他们需要能够将剩余的任何物品转移到被擦除的物品腾出的空间中。该标准说(无论如何,无论如何,通过其 moveAssignable 要求erase
上的要求),他们通过分配来做到这一点,因此包含的项目需要分配运算符。另一个选项可以像复制构造函数一样复制项目,但这不是完成的方式。
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 令人困惑的定义指令在C ++项目中
- 自定义 QML QQuick彩绘项目成员锚点未在 qml 中设置为父级
- 自定义构建文件更改不会触发VS 2017中的项目重建
- 为Qt项目树中的所有项目定义全局宏
- 我不断收到对项目"xxx"的错误未定义引用
- 是否可以在相同的命名空间中,但在不同的嵌套项目中定义具有相同名称的类
- C++ priority_queue与自定义比较器并删除任何项目
- 如何解决:自定义QGraphics项目接收鼠标新闻事件坐标延迟/滞后?
- 我可以在将项目编译为静态库(未定义的引用)时在代码中使用 QImage 吗?
- 优点和缺点 在类内为大型项目定义的内联朋友助手免费函数
- 使用 QtCreator 部署自定义构建的项目
- Cmake :几个使用自定义目标进行测试的项目
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- Qt项目与自定义共享库交叉编译Qt
- 如何获取外部项目定义的目标的输出路径?
- std :: vector :: erase(item)需要为项目定义的分配操作员
- 根据项目定义不同的功能