尝试将“==”重载传递给 std::map 比较器时出错
Error when trying to pass '==' overload to std::map comparator
我正在尝试传递自定义 class 的重载作为 std::map
.
的比较器
这里有一些代码和错误可以帮助你帮助我:
这里是Position.hpp
#ifndef POSITION_HPP_
# define POSITION_HPP_
class Position
{
public:
int _x;
int _y;
Position(){}
Position(int x, int y)
{
_x = x;
_y = y;
}
void setPosition(Position &newpos)
{
_x = newpos._x;
_y = newpos._y;
}
int getX()
{
return _x;
}
int getY()
return _y;
}
void setX(int x)
{
_x = x;
}
void setY(int y)
{
_y = y;
}
struct cmpIsSame{
inline bool operator==(const Position& pos)
{
if (pos._x == _x && pos._y == _y)
return true;
return false;
}
};
inline Position& operator=(const Position& pos)
{
_x = pos._x;
_y = pos._y;
return *this;
}
};
#endif
这里是 GameEngine.hh
中的地图声明
private:
std::map<Position, Case, Position::cmpIsSame> _cases;
这里是错误:
Position.hpp: In member function ‘bool Position::cmpIsSame::operator==(const Position&)’:
Position.hpp:17:7: error: invalid use of non-static data member ‘Position::_x’
int _x;
^
Position.hpp:52:21: error: from this location
if (pos._x == _x && pos._y == _y)
^
Position.hpp:18:7: error: invalid use of non-static data member ‘Position::_y’
int _y;
^
Position.hpp:52:37: error: from this location
if (pos._x == _x && pos._y == _y)
^
很乐意提供任何帮助?
首先,您必须使用函数对象或静态函数。
但是在任何情况下你的方法都是错误的,因为比较器应该满足与 operator <.
对应的严格的弱排序原则
来自 C++ 标准(23.2.4 关联容器)
3 The phrase “equivalence of keys” means the equivalence relation
imposed by the comparison and not the operator== on keys. That is,
two keys k1 and k2 are considered to be equivalent if for the
comparison object comp, comp(k1, k2) == false && comp(k2, k1) ==
false. For any two keys k1 and k2 in the same container, calling
comp(k1, k2) shall always return the same value.
至于错误
在 operator==
的实现中,您尝试访问封闭 class 的成员 _x
等。您无法在那里访问它们。在 class 中嵌入 class 是命名空间问题,而不是成员访问问题。
只提供一个自由函数或一个提供比较的仿函数会更容易。
至于map
中key的比较
std::map
is std::less
的键比较定义,默认调用 operator<
。为您使用的密钥实现重载 operator<
可能更容易。
bool operator<(const Position& lhs, const Position rhs&) {
// your implementation of "less" here...
}
至于执行less
这完全取决于您以及您在应用程序中使用它的方式。但作为第一个近似值(也是为了尝试启动和运行代码),请考虑使用点到原点(可能是 0,0)的距离 (pythagorean theory)。
我正在尝试传递自定义 class 的重载作为 std::map
.
这里有一些代码和错误可以帮助你帮助我:
这里是Position.hpp
#ifndef POSITION_HPP_
# define POSITION_HPP_
class Position
{
public:
int _x;
int _y;
Position(){}
Position(int x, int y)
{
_x = x;
_y = y;
}
void setPosition(Position &newpos)
{
_x = newpos._x;
_y = newpos._y;
}
int getX()
{
return _x;
}
int getY()
return _y;
}
void setX(int x)
{
_x = x;
}
void setY(int y)
{
_y = y;
}
struct cmpIsSame{
inline bool operator==(const Position& pos)
{
if (pos._x == _x && pos._y == _y)
return true;
return false;
}
};
inline Position& operator=(const Position& pos)
{
_x = pos._x;
_y = pos._y;
return *this;
}
};
#endif
这里是 GameEngine.hh
中的地图声明private:
std::map<Position, Case, Position::cmpIsSame> _cases;
这里是错误:
Position.hpp: In member function ‘bool Position::cmpIsSame::operator==(const Position&)’:
Position.hpp:17:7: error: invalid use of non-static data member ‘Position::_x’
int _x;
^
Position.hpp:52:21: error: from this location
if (pos._x == _x && pos._y == _y)
^
Position.hpp:18:7: error: invalid use of non-static data member ‘Position::_y’
int _y;
^
Position.hpp:52:37: error: from this location
if (pos._x == _x && pos._y == _y)
^
很乐意提供任何帮助?
首先,您必须使用函数对象或静态函数。 但是在任何情况下你的方法都是错误的,因为比较器应该满足与 operator <.
对应的严格的弱排序原则来自 C++ 标准(23.2.4 关联容器)
3 The phrase “equivalence of keys” means the equivalence relation imposed by the comparison and not the operator== on keys. That is, two keys k1 and k2 are considered to be equivalent if for the comparison object comp, comp(k1, k2) == false && comp(k2, k1) == false. For any two keys k1 and k2 in the same container, calling comp(k1, k2) shall always return the same value.
至于错误
在 operator==
的实现中,您尝试访问封闭 class 的成员 _x
等。您无法在那里访问它们。在 class 中嵌入 class 是命名空间问题,而不是成员访问问题。
只提供一个自由函数或一个提供比较的仿函数会更容易。
至于map
std::map
is std::less
的键比较定义,默认调用 operator<
。为您使用的密钥实现重载 operator<
可能更容易。
bool operator<(const Position& lhs, const Position rhs&) {
// your implementation of "less" here...
}
至于执行less
这完全取决于您以及您在应用程序中使用它的方式。但作为第一个近似值(也是为了尝试启动和运行代码),请考虑使用点到原点(可能是 0,0)的距离 (pythagorean theory)。