C ++无法重载< typedef结构中的运算符

时间:2017-05-11 18:46:06

标签: c++ struct operator-overloading typedef

我有一个像这样定义的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')

请帮忙!

1 个答案:

答案 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 我觉得这非常不对称,所以我更喜欢非会员<成员<