Ваш самый умный вариант - сделать его функцией друга .
Как упоминает JaredPar, глобальная реализация не может получить доступ к защищенным и закрытым членам класса, но есть проблема и с функцией-членом.
C ++ допускает неявное преобразование параметров функции, но не неявное преобразование this
.
Если существуют типы, которые можно преобразовать в ваш класс X:
class Y
{
public:
operator X(); // Y objects may be converted to X
};
X x1, x2;
Y y1, y2;
Только некоторые из следующих выражений будут компилироваться с функцией-членом.
x1 == x2; // Compiles with both implementations
x1 == y1; // Compiles with both implementations
y1 == x1; // ERROR! Member function can't convert this to type X
y1 == y2; // ERROR! Member function can't convert this to type X
Чтобы получить лучшее из обоих миров, нужно реализовать это как друга:
class X
{
int value;
public:
friend bool operator==( X& left, X& right )
{
return left.value == right.value;
};
};