使用运算符==的std::find时出错

Error using std::find with operator==

本文关键字:find 出错 运算符 std      更新时间:2023-10-16

我在以下结构中使用std::find时出错。。。

struct ComplianceOrderRecord {
    explicit ComplianceOrderRecord(IOrder& order);
    bool operator ==(const ComplianceOrderRecord& other) const;
    double price;
};
inline bool ComplianceOrderRecord::operator ==(const ComplianceOrderRecord& other) const {
    return price == other.price;
}

我使用它如下。。。

inline void Compliance::RemoveComplianceOrderRecord(const ComplianceOrderRecord& order) {
    auto it = std::find(m_compliantOrderList.begin(),
    m_compliantOrderList.end(), order);
    if(it == m_compliantOrderList.end()) {
        return;
    }
    m_compliantOrderList.erase(it);
}

错误是…

error C2679: binary '==' : no operator found which takes a right-hand operand of type 'const ComplianceOrderRecord' (or there is no acceptable conversion)

如有任何帮助理解此错误,我们将不胜感激。

您的operator==应该是const成员,或者更好的是,是一个独立函数。

如果m_compliantOrderList不是container<ComplianceOrderRecord >,则可以重现此错误。(也许它是指针的容器,或者其他一些完全无关的类。


编辑:

相等运算符可以比较ComplianceOrderRecord的两个实例,但find需要将指针与对象进行比较。重载一个运算符来执行这种比较是很奇怪的,所以可以将find_if与自定义谓词一起使用,例如:

   struct RecordIsEqualTo
   {
      const ComplianceOrderRecord* record;
      RecordIsEqualTo(const ComplianceOrderRecord& r): record(&r) {}
      bool operator() (const ComplianceOrderRecord* r) const { return *record == *r; }
   };
   std::find_if(m_compliantOrderList.begin(), m_compliantOrderList.end(),
      RecordIsEqualTo(order) );

或其lambda版本。

您的operator==函数应该是const。实际上,您不能在const对象(或对const.

的引用)上调用它

尝试一个const方法:

inline bool ComplianceOrderRecord::operator ==(const ComplianceOrderRecord& other) const {
return price == other.price;

}