2

为什么我不const输入函数时会收到错误消息bool operator<(const Node& otherNode) //const

stl_algo.h:91: error: passing 'const Node' as 'this' argument of 'bool Node::operator<(const Node&)' discards qualifiers

所有重载的运算符都应该是常量吗?

class Node {
public:
    double coordinate;

    bool operator==(const Node& other) const{
        return coordinate == other.coordinate;
    }

    bool operator<(const Node& other) const{
        return coordinate < other.coordinate;
    }
};
4

3 回答 3

6

不是所有的运营商,但==绝对<应该做const,是的。它们在逻辑上不会修改任何一个被比较的对象。

该错误可能来自从一个调用非const方法const,例如:

bool isSmaller(const Node& other) const
{
   return *this < other;
}

在这种情况下,由于方法isSmalleris constthis隐含地是一个const对象,因此operator <也必须是const才能使该上下文中的调用有效。

从错误消息中,似乎Node::operator <正在const从一个函数调用一个对象stl_algo.h- 排序/排序函数、散列函数等。

于 2012-12-18T14:06:45.463 回答
1

比较运算符,例如<, >, <=, >=, ==,!=应该const在一般情况下对对象进行操作,因为如果任何被比较的对象都可以通过比较来更改是没有意义的。但是您可以将比较声明为非成员函数,以确保两个操作数之间的对称性。

class Node {
public:
    double coordinate;
};
inline operator<(const Node& lhs, const Node& rhs)
{
  return lhs.coordinate < rhs.coordinate;
}
于 2012-12-18T14:11:15.600 回答
0

您是否尝试删除该方法的 const 修饰符?此外,正如@LuchianGrigore 所建议的,您可以使用this关键字:

bool operator< (const Node& other) {
    return this.coordinate < other.coordinate;
}
于 2012-12-18T14:15:02.183 回答