Мы можем определить функцию друга внутри класса в cpp

  1. согласно правилу мы не можем определить функцию друга внутри класса
  2. для istream и ostream мы всегда объявляем функцию друга (так это правильно) в приведенном ниже коде

Но проблема для 1-го пункта в том, как для данного кода может быть возможным успешное выполнение.... на компиляторе GNU (ubuntu)

#include<bits/stdc++.h>

using namespace std;

class dev{
    string str;
    int n;
public:
    friend void operator >>(istream &din,dev &s1)
    {
        din>>s1.str>>s1.n;
    }
    friend void operator <<(ostream &dout,dev &s1)
    {
        dout<<s1.str<<" "<<s1.n;
    }
};

int main()
{
    dev s2;
    cin>>s2;
    cout<<s2;
}

1 ответ

Согласно стандарту C++ (11,3 друзей)

6 Функция может быть определена в объявлении друга класса тогда и только тогда, когда класс является нелокальным классом (9.8), имя функции является неквалифицированным, а функция имеет область пространства имен.

Однако он не виден за пределами класса, пока не будет объявлен во вложенном пространстве имен.

Тем не менее, компилятор может найти функцию благодаря так называемому Argument Dependent Lookup.

Именно из-за ADL в вашем примере операторы вызываются успешно.

Например, для этого утверждения

cout<<s2;

компилятор видит, что используется объект типа dev (dev s2;), и ищет оператор в области видимости класса.

Учтите, что лучше, когда операторы возвращают ссылки на потоки. В этом случае вы можете объединить операторы с другими операторами потока. Например

friend std::ostream & operator <<( std::ostream &dout, const dev &s1 )
{
    return dout << s1.str << " " << s1.n;
}
Другие вопросы по тегам