vector::擦除失败,二进制表达式(T和常量T)的操作数无效
vector::erase fails with invalid operands to binary expression (T and const T)
我有一个名为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
需要一种方法来比较requests
和request
中的Request
s,以查看哪些Request
s匹配并且需要移除。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;}
};
致以最良好的问候。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 控制允许动态运行c++的并发操作数
- 二进制表达式的操作数无效("常量字符*"和"常量字符*")
- 字符和常量字符[2] 类型的操作数无效到二进制运算符
- 未找到采用常量类型的左操作数的'=='运算符
- 二进制表达式的操作数无效("无线电设备"和"常量无线电设备")
- 与'operator[]'不匹配(操作数类型为 'QVariant' 和"常量字符 [2]") QVariant/QVariantMap
- C++ [错误] 与"操作员=="不匹配(操作数类型为"车辆"和"常量车辆")
- 二进制表达式的操作数无效("int_node"和常量"int_node")
- 第一个操作数是常量表达式时的'?:'类型
- 常量字符* 类型的无效操作数