&#39;操作员LT;&#39;创建std :: pair <a,b>时出错

时间:2015-05-19 13:34:00

标签: c++ qt stl

我已经为此做了一个解决方法,但仍想了解这个问题。

我有一个Multimap

multimap<QPoint,Figure*> mymap;

QPoint 是来自Qt 5.4的课程。 图* 是指向a的指针 我自己编造的课程。

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

此示例工作正常:

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; }
[..]

然后是通常的5公里堆叠STL错误消息。 第一:&#39;类型&#39; QPoint和QPoint。他们是,如 如上所述,QPoint和图*。

任何可以捣乱的人?

CORRECTION

毕竟,我的解决办法无效。我忘记了 去评论     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.
  }

2 个答案:

答案 0 :(得分:2)

multimap中的密钥默认排序为std::less,在密钥类型上调用operator<

您的关键对象(QPoint)没有operator<进行比较。

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

答案 1 :(得分:2)

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;