尝试将'=='重载传递给std :: map比较器时出错

时间:2015-06-25 13:28:09

标签: c++ operator-overloading comparator non-static

我正在尝试将自定义类的重载作为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)
                                     ^

任何帮助都会很愉快吗?

2 个答案:

答案 0 :(得分:1)

首先,您必须使用功能对象或静态功能。 但无论如何你的方法都是错误的,因为比较器必须满足与运算符相对应的严格弱排序原则<。

来自C ++标准(23.2.4关联容器)

  

3短语“等价键”是指等价关系   比较强加的而不是运营商==按键。那是,   如果对于,则认为两个密钥k1和k2是等价的   比较对象comp,comp(k1,k2)== false&amp;&amp; comp(k2,k1)==   假。对于同一容器中的任意两个键k1和k2,调用   comp(k1,k2)应始终返回相同的值。

答案 1 :(得分:1)

关于错误

operator==的实现中,您尝试访问封闭类的成员_x等。你无法在那里访问它们。在类中嵌入类是名称空间问题,而不是成员访问问题。

提供免费功能或提供比较的仿函数会更容易。

关于map

中键的比较

std::map的关键比较定义为std::less,默认情况下会调用operator<。为您使用的密钥实现重载operator<可能更容易。

bool operator<(const Position& lhs, const Position rhs&) {
  // your implementation of "less" here...
}

关于less

的实施情况

这完全取决于您在应用程序中使用它的方式。但作为第一个近似近似(也尝试获取代码),请考虑使用点到原点的距离(pythagorean theory)(可能为0,0)。