Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Язык допускает предварительное объявление (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'
};
Я думаю, что если ты потрудишься переформулировать свой вопрос без использования ошибочных утверждений, то ответ найдется автоматически.