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;
}

この場合、メソッドisSmallerはであるためconstthisは暗黙的にconstオブジェクトであるため、そのコンテキスト内での呼び出しを有効にするためにも である必要がありますoperator <const

エラー メッセージから、 がオブジェクトに対してNode::operator <呼び出されているように見えます。ソート/順序付け関数、ハッシュ関数などの関数から呼び出されています。conststl_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 に答える