繁体   English   中英

C++:带有 const int 的 class 的 vector.erase 实例给出“试图引用已删除的函数”错误 C2280

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM