gpt4 book ai didi

C++:具有 const int 的类的 vector.erase 实例给出 "attempting to reference a deleted function"错误 C2280

转载 作者:行者123 更新时间:2023-11-28 01:50:13 26 4
gpt4 key购买 nike

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

B 类有一个 const int 属性 const_int。如果我制作一个 B 实例 vector ,然后从该 vector 中删除一个元素 - 我会收到以下错误:

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() 试图调用 B 类中的某个函数吗?谢谢!

B.h

#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文档:

Type requirements - T must meet the requirements of MoveAssignable.

因此,为了使用 std::vector::erase,您需要有一个移动赋值运算符 ( T& operator = (T&&) ),或者复制赋值运算符 (T& operator = (const T&))。由于您提供了自己的构造函数,因此编译器不会生成任何赋值运算符。

此要求背后的逻辑是 vector 试图用其余变量填充 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 并提供移动赋值运算符。

关于C++:具有 const int 的类的 vector.erase 实例给出 "attempting to reference a deleted function"错误 C2280,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com