自定义类比较器无效的STL映射

时间:2015-04-15 14:34:14

标签: c++ class c++11 dictionary

我有一个以类为键的地图。

在这个课程中,我重载了<运算符,我在这里读到地图会自动使用它进行比较和排序。

编译时出现以下错误:

  

错误1错误C2664:'std :: pair :: pair(const   std :: pair&amp;)':无法转换参数1   '位置'到'位置*常数&amp;' e:\ program files \ visual studio 2013   最终\ VC \包括\ xmemory0

我没有得到真正的意义或我如何避免它。它也没有在我的代码中突出显示任何内容。

这是我的代码,我的类是坐标,我希望它们从左到右,从上到下排序,但逻辑不是问题。

位置文件中显然有更多内容,但我认为这些是相关部分。

的main.cpp

int main()
{
  std::map<Position*, int> karte;
  Position p1;
  p1.setX(0);
  p1.setY(0);

  Position p2;
  p2.setX(0);
  p2.setY(1);

  Position p3;
  p3.setX(1);
  p3.setY(0);

  Position p4;
  p4.setX(1);
  p4.setY(1);

  karte.emplace(p1, 1);
  karte.emplace(p2, 2);
  karte.emplace(p3, 3);
  karte.emplace(p4, 4);

  for (auto& x : karte)
  {
    std::cout << x.first->toString() << ": " << x.second << std::endl;
  }
  return 0;
}

Position.h

bool operator<(const Position&) const;

Position.cpp

bool Position::operator<(const Position &position) const
{
  if ((x_ < position.x_) && (y_ == position.y_))
  {
    return true;
  }
  if (x_ > position.x_ && y_ < position.y_)
  {
    return true;
  }
  if (x_ == position.x_ && y_ < position.y_)
  {
    return true;
  }
  else
  {
    return false;
  }
}

2 个答案:

答案 0 :(得分:3)

将地图重新​​定义为:

std::map<Position, int> karte;

编译错误是因为您尝试在地图中插入pair<Position, int>

Position p1;
<snip>
karte.emplace(p1, 1);

并且您已将地图声明为map<Position*, int>

答案 1 :(得分:3)

如果你需要地图的指针作为指针,你可以创建自己的比较器并将其传递给地图:

struct PositionPointerLesser
{
  bool operator() (Position *lhs, Position *rhs) const
  {
    return *lhs < *rhs;  // This calls the operator < in your class
  }
};

int main()
{
  std::map<Position*, int, PositionPointerLesser> karte;
  // ...
}