vector::擦除失败,二进制表达式(T和常量T)的操作数无效

vector::erase fails with invalid operands to binary expression (T and const T)

本文关键字:常量 操作数 无效 失败 擦除 二进制 表达式 vector      更新时间:2024-09-29

我有一个名为Request的类,像这样,

class Request {};

我将这种类型的对象存储在一个名为的全局向量中

std::vector<Request> requests;

我使用初始化对象

auto &request = requests.emplace_back();

现在,我尝试使用emplace_back提供的引用来删除对象,如下所示,

requests.erase(std::remove(requests.begin(), requests.end(), request), requests.end());

它无法编译并输出以下错误,

sysroot/include/c++/v1algorithm:2103:24: error: invalid operands to binary
expression ('Request' and 'const Request')
if (!(*__i == __value_))
~~~~ ^  ~~~~~~~~

我应该在这里做些什么来编译它?

在中

requests.erase(std::remove(requests.begin(), requests.end(), request), requests.end());

提问者被std::erase和没有编译器生成赋值运算符的类的问题的答案弄糊涂了。这里的问题不在于std::erase和赋值运算符,无论如何,Request足够简单,编译器会自动为它们生成一个赋值运算符。但要注意"三条规则"和朋友们。可以生成默认赋值运算符并不意味着默认行为在逻辑上是正确的。

询问者的问题在于线路的std::remove部分。std::remove需要一种方法来比较requestsrequest中的Requests,以查看哪些Requests匹配并且需要移除。CCD_ 11使用CCD_ 12运算符来执行比较。C++编译器不会为您生成相等运算符,因为出错的几率太高了。例如,要比较哪些成员?全部?其中一个?只有名字和姓氏?学生证?银行账号?

所以我们添加了一个

bool operator==(const Request& lhs, const Request& rhs)
{ 
return /* comparison logic*/;
}

去做繁重的工作。

请参阅运算符重载的基本规则和习惯用法是什么?了解有关操作员过载的更多细节和一般智慧。

定义运算符==时编译代码

class Request
{
public:
bool operator==(const Request &other) const {return true;}
};

致以最良好的问候。