перегрузка оператора <внутри класса - PullRequest
2 голосов
/ 29 февраля 2012

Я пытаюсь использовать простую структуру в качестве ключа карты:

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) 'должен принимать ровно один аргумент </p>

Насколько я понимаю, компиляторы хотят сравнить index с этим Foo. Как тогда перегрузить оператора?

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Если вы хотите сравнить два индекса, переместите перегрузку в структуру index:

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

Если вы хотите сравнить Foo и index (я сомневаюсь в этом, но на всякий случай поставлю это здесь), удалите второй параметр, так как он не нужен:

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

Обратите внимание, что вы должны передать параметр index по ссылке, чтобы предотвратить ненужное копирование.

РЕДАКТИРОВАТЬ: Как правильно указал Als, этот оператор должен быть const.

2 голосов
/ 29 февраля 2012

< - это двоичный инфиксный оператор сравнения, т. Е. Для сравнения требуется два аргумента, поэтому в идеале он должен быть реализован как свободная функция, однако, если вы реализуете его как функцию-член, он будет принимать только один аргумент.

Он должен сравнивать аргумент, передаваемый в качестве параметра, с объектом, для которого вызывается функция-член.

Ваш оператор сравнения члена должен выглядеть следующим образом:

class Foo
{
    //...
    bool operator<(const index& rhs) const 
    { 
        /* comparison with *this */ 
    }
    //...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...