Разница в том, что в первом фрагменте вы объявляете оператор только в пределах X
, но не за его пределами. operator==(int,X const &)
недоступен из main
. Если вы исправите это и объявите это также снаружи, вы получите только предупреждения:
class X {
public:
friend bool operator==(int, X const &);
};
bool operator==(int,X const&); // <--
int main() {
2 == X(); // ok...
static_cast<bool (*)(int, X const &)>(&operator==); // Error: 'operator==' not defined
return 0;
}
Обратите внимание, что в обоих случаях вам нужно определение для фактического вызова оператора.
Для иллюстрации учтите, что с
struct foo {
friend void bar() {
std::cout << "this is a inline definition of friend funtion";
}
};
Единственный способ получить доступ к bar
извне foo
- это добавить объявление вне foo
:
void bar();