Если перегрузить бинарный оператор как функцию члена, то он должен принимать только одну аргумент. Первый операнд - это объект, на который вызывается оператор (т. Е. *this
); второй операнд является аргументом единственной функции.
struct names {
//...
// better to pass by reference;
// make the function 'const' so it can be used on constant objects
bool operator==(names const & rhs) const {
return this->fname == rhs.lname;
}
};
В качестве альтернативы, вы можете перегрузить его как функцию , не являющихся членами, с двумя аргументами:
bool operator==(names const & lhs, names const & rhs) {
return lhs.fname == rhs.lname;
}
Если необходим доступ к закрытым членам (это не так, в этом примере), тогда это должен был быть друг. Вы можете определить друзей внутри определения класса; в этом случае код будет выглядеть точно так же, как ваш пример, только с friend
перед объявлением функции.
(Конечно, это не разумное определение равенства, так как это не является симметричным. Многие алгоритмы сломается, если вы можете иметь a == b
, но не b==a
, как вы можете с этим определением. lhs.fname == rhs.fname && lhs.lname == rhs.lname
бы больше смысла.)
Вы выполняете перегрузку как функцию нестатического члена, поэтому он уже имеет неявный параметр объекта. –
Сделать его не членом. – juanchopanza
И желательно не принимать его аргументы по значению. –