我想用自己的结构'Point2'作为关键字制作地图,但是我收到错误而且我不知道是什么导致它,因为我声明了'运算符<'对于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.0\vc\include\xfunctional(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:\testing\project\point2.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.0\vc\include\xfunctional(124) : while compiling class template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
1> with
1> [
1> _Ty=Point2
1> ]
任何人都可以看到导致问题的原因吗?
答案 0 :(得分:9)
std::map
需要operator <
的const版本:
// 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);
}
答案 1 :(得分:3)
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 );
}