【问题标题】:No '==' operator found which takes a left-hand operand of const Type未找到采用 const 类型左侧操作数的“==”运算符
【发布时间】:2016-12-07 03:56:21
【问题描述】:

我正在重构我的一些代码以使用结构而不是单个对象。

由于此更改,我需要为“==”添加运算符,以便我现有的涉及函数的向量可以正确评估存储在向量中的对象。

class IdentifyingClass; //forward declare class     
Class ReturnData
{
public:
  IdentifyingClass* value;
  float  some_trivial_additional_data;

  bool operator==(const ReturnData& query_obj)
  {
    return value == query_obj.value;
  }

  bool operator==(const IdentifyingClass* query_obj)
  {
    return value == query_obj;
  }
}

我所有依赖于此类的现有代码都可以正常运行。我认为这是一个开放和封闭的重构。

然后我在使用此类类型的特定边缘案例中的不同解决方案中的不同位置使用它。我正在尝试使用这个

IdentifyingClass* object;
const std::vector<ReturnData>& data_vector = GetDataFromPlace();
if(std::find(data_vector.begin(), data_vector.end(), object) != data_vector.end()))
{
  //do special action;
}

现在我正在生成一个向量“==”比较错误,告诉我我没有“const ReturnData”的左侧“==”操作数。

【问题讨论】:

  • 不,我只是想提供有关我正在做的事情的上下文,然后解决方案是可以接受的。这是一篇问答帖。
  • 我投票结束这个问题,因为它不是真正的问题
  • 好吧。如果我不小心误用了堆栈溢出,我深表歉意。我只是想做出贡献。
  • @Jakey113G 不妨评论一下——你为什么想要像运算符 == 那样带有指针的反直觉的东西?如果我想比较指针值是否相等,比如在重载赋值运算符中怎么办?当 C++ 程序员看到正在比较的指针时,它期望指针正在被比较。如果他们想要比较一个对象,那么用户应该知道取消引用指针并使用它。引入带指针的重载运算符 == 会增加编译错误的风险,或者更糟糕的是,在运行时发生奇怪事件。

标签: c++ vector operator-overloading


【解决方案1】:

当我的参数显然在处理 const 时,我在困惑地寻找为什么运算符不是 const 时尝试了一些方法。

到了我将上面的代码更改为使用 std::find_if 并使用 lambda 作为我的谓词来将代码解析为我想要的功能的地步。

真正的问题是我的操作符没有被标记为 const:

bool operator==(const ReturnData& query_obj) const
{
  return value == query_obj.value;
}

bool operator==(const IdentifyingClass* query_obj) const
{
  return value == query_obj;
}

我将这个相当微不足道的问题写成堆栈溢出帖子的原因是,我发现与此类似的其他帖子只突出了这些帖子的其他问题,而不是这个具体案例,这确实需要一段时间才能发现。

我的问题的热门相关帖子:

Vector is of const objects

Typedef and namespace issue

【讨论】:

  • 要回答你上面的问题,你可以提交问题和答案。我认为这是一个有效的贡献。我还在回答的最后说了我为什么这样做。我现在将删除此帖子,因为您似乎已向我明确表示永远不要提交问题答案帖子。
猜你喜欢
  • 2019-07-31
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2018-08-13
  • 2013-05-02
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多