重载类中的<运算符

overloading the < operator inside a class

本文关键字:lt 运算符 重载      更新时间:2023-10-16

我正在尝试使用一个简单的结构作为映射键:

class Foo{
 .
 .
 .
  struct index{
    int x;
    int y;
    int z;
  };
  bool operator<(const index a, const index b);
  .
  .
  .
}

以及它的功能:

bool Foo::operator<(const index a, const index b){
  bool out = True;
  if (a.x == b.x){
    if (a.y == b.y){
      if (a.z >= b.z) out = false;
    }
    else if(a.y > b.y) out = false;
  } else if (a.x > b.x) out = false;
  return out;
}

然而,当我编译时,我得到了一个错误:

memMC.h:35:错误:'bool Foo::operator<(Foo::index,Foo::index)'必须只接受一个参数

据我所知,编译器希望将index与此Foo进行比较。那么我该如何让操作员过载呢?

如果要比较两个索引,请在index结构中移动重载:

struct index{
    int x;
    int y;
    int z;
    bool operator<(const index& a) const;
};

如果你想比较Fooindex(我对此表示怀疑,但我只是把它放在这里以防万一),删除第二个参数,因为它不需要:

class Foo{
  //...
  bool operator<(const index& a) const;
};

请注意,应该通过引用传递index参数,以防止不必要的复制。

编辑:正如Als正确指出的,这个运算符应该是const

<是二进制中缀比较运算符,即它需要两个参数来相互比较。因此,理想情况下,它应该作为一个自由函数来实现。但是,如果您将其作为成员函数来实现,那么它只需要一个参数。

它应将作为参数传递的参数与调用成员函数的对象进行比较。

你的会员比较操作员应该是这样的:

class Foo
{
    //...
    bool operator<(const index& rhs) const 
    { 
        /* comparison with *this */ 
    }
    //...
};