Информация об изменениях

Сообщение Re: Почему нельзя предварительно объявить дружественную функ от 24.09.2023 18:38

Изменено 24.09.2023 18:48 rg45

Re: Почему нельзя предварительно объявить дружественную функцию-член?
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Язык допускает предварительное объявление (forward declaration) дружественной (friend) обычной (non-member) функции...


И сходу неправильно. Объявление функции дружественной не является предварительным объявлением функции:

http://coliru.stacked-crooked.com/a/92590ae0842c85d9

struct A
{
    friend void foo();
};

int main()
{
    foo(); // error: 'foo' was not declared in this scope
}


Язык допускает объявление дружественной функции без ее предварительного объявления только для функций из того же пространства имен, что и сам класс. А для того, чтобы объявить дружественной функцию из другого пространсва имен, ее нужно будет сначала объявить. И сделать это нужно будет в пространстве имен функции.

Я думаю, что если ты потрудишься переформулировать свой вопрос без использования ошибочных утверждений, то ответ найдется автоматически.
Re: Почему нельзя предварительно объявить дружественную функ
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Язык допускает предварительное объявление (forward declaration) дружественной (friend) обычной (non-member) функции...


И сходу неправильно. Объявление функции дружественной не является предварительным объявлением функции:

http://coliru.stacked-crooked.com/a/92590ae0842c85d9

struct A
{
    friend void foo();
};

int main()
{
    foo(); // error: 'foo' was not declared in this scope
}


Язык допускает объявление дружественной функции без ее предварительного объявления только для функций из того же пространства имен, что и сам класс. А для того, чтобы объявить дружественной функцию из другого пространства имен, ее нужно будет сначала объявить. И сделать это нужно будет в пространстве имен функции.

http://coliru.stacked-crooked.com/a/5da8e14983baa2f4

namespace ns
{

void foo();
    
} // namespace ns

struct A
{
    friend void ns::foo(); // Ok
    friend void ns::bar(); // error: 'void ns::bar()' should have been declared inside 'ns'
};


Я думаю, что если ты потрудишься переформулировать свой вопрос без использования ошибочных утверждений, то ответ найдется автоматически.