簡體   English   中英

具有自定義類比較器的STL映射不起作用

[英]STL map with custom class comparator not working

我有一張地圖,其中有一個類作為鍵。

在此類中,我重載了<運算符,在這里我讀到地圖將自動使用它進行比較和排序。

編譯時出現以下錯誤:

錯誤1錯誤C2664:'std :: pair :: pair(const std :: pair&)':無法將參數1從'Position'轉換為'Position * const&'e:\\ program files \\ Visual Studio 2013 Ultimate \\ 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;
  }
}

將地圖重新​​定義為:

std::map<Position, int> karte;

編譯錯誤是因為您試圖在地圖中插入pair<Position, int>

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

並且您已將地圖聲明為map<Position*, int>

如果您需要地圖的鍵作為指針,則可以創建自己的比較器並將其傳遞給地圖:

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;
  // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM