std::less<> 不适用于我的 std::map

std::less<> not working with my std::map

本文关键字:std 我的 map 适用于 不适用 less gt lt      更新时间:2023-10-16

我想用我自己的结构"Point2"作为键制作一个映射,但我遇到了错误,我不知道是什么原因造成的,因为我声明了一个"operator<"对于Point2结构。

代码:

std::map<Point2, Prop*> m_Props_m;
std::map<Point2, Point2> m_Orders;
struct Point2
{
    unsigned int Point2::x;
    unsigned int Point2::y;
Point2& Point2::operator= (const Point2& b)
    {
        if (this != &b) {
            x = b.x;
            y = b.y;
        }
        return *this;
    }
    bool Point2::operator== (const Point2& b)
    {
        return ( x == b.x && y == b.y);
    }
    bool Point2::operator< (const Point2& b)
    {
        return ( x+y < b.x+b.y );
    }
    bool Point2::operator> (const Point2& b)
    {
        return ( x+y > b.x+b.y );
    }
};

错误:

1>c:program files (x86)microsoft visual studio 10.0vcincludexfunctional(125): error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Point2' (or there is no acceptable conversion)
1>c:testingprojectpoint2.h(34): could be 'bool Point2::operator <(const Point2 &)'
1>while trying to match the argument list '(const Point2, const Point2)'
1>c:program files (x86)microsoft visual studio 10.0vcincludexfunctional(124) : while compiling class template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
1>          with
1>          [
1>              _Ty=Point2
1>          ]

有人能看到问题的原因吗?

std::map需要operator <:的常量版本

// note the final const on this line:
bool Point2::operator< (const Point2& b) const
{
    return ( x+y < b.x+b.y );
}

operator==operator>的非常量版本是没有意义的,它们也应该是const

正如ildjarn在下面指出的那样,这是一个明显的例子,您可以将这些运算符实现为自由函数,而不是成员函数。通常,您应该更喜欢将这些运算符作为自由函数,除非它们需要作为成员函数。这里有一个例子:

bool operator<(const Point2& lhs, const Point2& rhs)
{
    return (lhs.x + lhs.y) < (rhs.x + rhs.y);
}

operator<应该定义为const,事实上,您的其他比较运算符也应该定义为,通常,任何不会改变其类的方法:

bool Point2::operator== (const Point2& b) const
{
    return ( x == b.x && y == b.y);
}
bool Point2::operator< (const Point2& b) const
{
    return ( x+y < b.x+b.y );
}
bool Point2::operator> (const Point2& b) const
{
    return ( x+y > b.x+b.y );
}