我已经为此做了一个解决方法,但仍想了解这个问题。
我有一个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和图*。
任何可以捣乱的人?
毕竟,我的解决办法无效。我忘记了 去评论 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.
}
答案 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;