创建 std::p air<A,B 时'operator<'错误>

'operator<' error while creating an std::pair<A,B>

本文关键字:lt operator gt 错误 air std 创建      更新时间:2023-10-16

我已经有解决方法,但仍然想了解问题。

我有一个多重地图

multimap<QPoint,Figure*> mymap;

QPoint 是 Qt 5.4 中的一个类。图 * 是指向类是我自己炮制的。

现在我想向该地图添加元素。

此示例工作正常:

multimap<int,int> test;
test.insert(pair<int,int>(41,43));

就像这个一样(据说解决方法(

std::pair<QPoint,Figure*> p;
p.first = pos;
p.second =  sub_fig;
mymap.insert(p);

然而,平原的第一反射

std::pair<QPoint,Figure*> p(pos, sub_fig);

让该行的编译器声明如下:

[..]
scanner.cpp:264:17:   required from here
/usr/include/c++/4.9/bits/stl_function.h:371:20: error: no match for
‘operator<’ (operand types are ‘const QPoint’ and ‘const QPoint’)
  { return __x < __y; }
[..]

然后是通常的五公里堆叠的 STL 错误消息。第一:"类型">不是QPoint和QPoint。他们是,作为如上所述,QPoint和图*。

有人能解开这个吗?

校正

毕竟,我的解决方法也不起作用。我忘了去评论 res.insert(p(;

以下是完整的相关代码:

multimap<QPoint,Figure*> res;
// ...
vector<Figure*> stack = figure->get_above_figure_stack();
  for (vector<Figure*>::const_iterator CI2=stack.begin();
    CI2!=stack.end();CI2++)
  {
    // ..
    Figure* sub_fig = *CI2;
    std::pair<QPoint,Figure*> p;
    p.first = pos;
    p.second =  sub_fig;
    res.insert(p); // <- The bad line.
  }

>multimap需要键的排序关系,其默认值是使用<(以std::less为幌子(。

由于QPoint没有operator<的重载,编译器抱怨它不存在。

提供一个并不难:

bool operator< (const QPoint& lhs, const QPoint& rhs)
{
    return lhs.x() < rhs.x() || (lhs.x() == rhs.x() && lhs.y() < rhs.y());
}

bool lessQPoints (const QPoint& lhs, const QPoint& rhs)
{
    return lhs.x() < rhs.x() || (lhs.x() == rhs.x() && lhs.y() < rhs.y());
}
multimap<QPoint, Figure*, lessQPoints> mymap;
默认情况下,

multimap中的键按std::less排序,调用密钥类型上的operator<

您的密钥对象 (QPoint( 没有operator<进行比较。

您需要使用适当的多重映射构造函数提供自己的比较函数。