Не предполагается ли явное определение функции друга вне класса?
Если да, то почему я могу объявить функцию друга внутри определения класса так же, как любая функция-член?
Что это?
Это только ОК с некоторыми операторами, такими как <
operator или применимо ко всем операторам?
Если это применимо ко всем из них, есть ли недостаток для этого?
Следует ли его избегать? Если да, то почему?
class person
{
public:
bool operator<(int num)
{
return x < num ? true : false ;
}
bool operator<(person& p)
{
return x < p.x ? true : false ;
}
friend bool operator<(int num, person &p)
{
return p.x < num ? true : false ;
}
void setX(int num)
{
x = num;
}
private:
int x;
};
Обновление:
Я не прошу выбрать перегрузку оператора, не являющегося членом, или перегрузку оператора-члена.
Я хочу знать, что:
Почему нам разрешено перемещать определение методов друзей внутри нашего определения класса? ,
Разве это не нарушает никаких вещей? Если это не так, почему у нас есть друзья на первом месте?
Мы могли бы просто определить перегрузки как функции-члены (я знаю ограничения функций-членов). Но я говорю, зная это: почему компилятор не жалуется, что я не определил функцию друга вне определения класса, поскольку он не должен быть внутри него (из-за параметра класса, который у него есть). Почему же нам разрешено определять функцию друга внутри определения класса?