我有一个像这样定义的typedef结构:
typedef struct myStruct {
int id;
double value;
bool operator <(const myStruct &x, const myStruct &y) {
return (x.id < y.id);
}
} myStruct;
我需要将此结构用作std :: map中的键,从而重载运算符。但是,我在尝试编译时收到以下错误消息:
overloaded 'operator<' must be a binary operator (has 3 parameters)
好的,所以我尝试了这个:
bool operator <(const pointcloud_keyframe &x) {
return (this->id < x.id);
}
但是,这不起作用,因为我在尝试插入地图时收到此错误消息:
invalid operands to binary expression ('const myStruct' and 'const myStruct')
请帮忙!
答案 0 :(得分:5)
struct myStruct {
int id;
double value;
friend bool operator <(const myStruct &x, const myStruct &y) {
return (x.id < y.id);
}
};
关键部分是friend
。我还删除了typedef
;在C ++中struct myStruct
已经定义了一个名为myStruct
的类型,不需要typedef
它。
还有其他方法可以编译代码,但这是最简单的方法。
如果没有friend
,则operator<
是成员函数,成员operator<
将一个参数加上隐式this
。 1
使用friend
,它成为一个带有2个参数的“自由函数”。我发现这是最干净的方法。它仍然拥有访问struct
(它可能不需要)的私有位的完全权限。
您也可以将其移出struct
本身
struct myStruct {
int id;
double value;
};
inline bool operator <(const myStruct &x, const myStruct &y) {
return (x.id < y.id);
}
但是<
是friend
相对无害。此外,对于template
类型,朋友策略可以更好地扩展。所以我习惯使用它,即使技术上“权限越少越好”。
1 我觉得这非常不对称,所以我更喜欢非会员<
成员<
。