2017-04-09 153 views
0

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

B类有一个const int属性const_int。如果我让乙实例的向量,然后删除其中的向量元素 - 我得到以下错误:

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() 
{ 
} 

Source.cpp

#include "B.h" 

int main() { 
    vector<B> test; 
    test.push_back(B(1)); 
    test.erase(test.begin()); 
    return 0; 
} 
+0

'std :: vector <> :: erase'需要能够分配向量的元素以折叠空间(由擦除操作创建)。由于类“B”包含一个常量,赋值运算符会自动声明为由编译器删除,因为它不可能分配为常量值。请参阅__Type requirements__ http://en.cppreference.com/w/cpp/container/vector/erase –

回答

1

根据std::vector::erase文档:

Type requirements - T must meet the requirements of 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()); 

另一个可能性是失去了constconst_int和提供移动赋值oeprator。

+0

指针数组工作,非常感谢! –

相关问题