![](/img/trans.png)
[英]error C2280: attempting to reference a deleted function (trying to call vector.erase)
[英]C++: vector.erase instance of a class with const int gives "attempting to reference a deleted function" error C2280
C++:带有 const int 的 class 的 vector.erase 实例给出“试图引用已删除的函数”错误 C2280
Class B 有一个 const int 属性const_int
。 如果我制作 B 实例的向量,然后从该向量中删除一个元素 - 我会收到以下错误:
Error C2280 'B &B::operator =(const B &)': attempting to reference a deleted function VectorTest c:\program files (x86)\microsoft visual studio\2017\prof\vc\tools\msvc\14.10.25017\include\xutility 2534
如果我删除const
关键字 - 错误就会消失。 如何在保持我的属性const_int
不变的同时修复它? 为什么会出现这个错误,是vector.erase()试图从class B调用一些function吗? 谢谢!
Bh
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class B
{
private:
const int const_int;
public:
B(int const_int_input);
~B();
};
B.cpp
#include "B.h"
B::B(int const_int_input) : const_int(const_int_input)
{
}
B::~B()
{
}
源.cpp
#include "B.h"
int main() {
vector<B> test;
test.push_back(B(1));
test.erase(test.begin());
return 0;
}
根据std::vector::erase
文档:
类型要求-T必须满足MoveAssignable的要求。
因此,要使用std::vector::erase
,您需要具有一个移动分配运算符( T& operator = (T&&)
)或一个复制分配运算符( T& operator = (const T&)
)。 由于您提供了自己的构造函数,因此编译器不会生成任何赋值运算符。
该要求背后的逻辑是向量试图填补其余变量因erase
而造成的间隙。 它尝试将元素向右移至已擦除元素,以填补孔的erase
。
由于您的类具有const int
,这意味着您实际上并不希望分配对象,因为const_int
是.. const。 您明确表示您不希望重新分配此变量。
在这种情况下,您可以创建一个指向B的指针数组:
std::vector<std::unique_ptr<B>> vector;
vector.emplace_back(std::make_unique<B>(1));
vector.erase(vector.begin());
另一种可能性是丢失const_int
上的const
并提供移动分配操作符。
您还可以使用std::list (双向链表,如果不需要通过整数索引)它不进行元素的这种移动, std::set (适合插入和删除)或std::unordered_set (如果顺序不没关系,提到的 3 个备选方案中最有效的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.