创建 std::p air<A,B 时'operator<'错误>
'operator<' error while creating an std::pair<A,B>
我已经有解决方法,但仍然想了解问题。
我有一个多重地图
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<
进行比较。
您需要使用适当的多重映射构造函数提供自己的比较函数。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 'operator='已弃用:改用 QDir::setPath()
- <<操作员在下面的行中工作
- 过载'operator new'如何导致无限循环?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 处理"no operator found"
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 运算符重载:"operator+"必须采用零个或一个参数
- 使用 operator() 扩展 Eigen::EigenBase
- 重载operator< & lt;作为会员打印
- Operator< & lt;重载隐藏其他
- 重载ostream&时转换错误无效;operator< & lt;
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- operator< & lt;在c++中为类中的类重载
- 将std::endl传递给std::operator<<
- operator< & lt;重载、名称空间和模板