Дружественные объявления
При объявлении дружественной функции, которая не была объявлена ранее, эта функция экспортируется во включающую область вне класса.
Функции, объявленные в объявлении friend, обрабатываются так, как если бы они были объявлены с ключевым словом extern. (Дополнительные сведения о ключевом слове extern см. в разделе Статические спецификаторы класса хранения.)
Хотя функции с глобальной областью действия могут быть объявлены как дружественные до объявления своих прототипов, функции-члены не могут быть объявлены как дружественные функции до полного объявления их класса. В следующем коде показано, почему при этом возникает ошибка.
class ForwardDeclared; // Class name is known.
class HasFriends
{
friend int ForwardDeclared::IsAFriend(); // C2039 error expected
};
В предыдущем примере в области действия вводится имя класса ForwardDeclared, но полное объявление — в частности, часть, в которой объявляется функция IsAFriend, — отсутствует. Поэтому объявление friend в классе HasFriends вызывает ошибку.
Чтобы объявить два класса как дружественные друг другу, весь второй класс должен быть указан как дружественный для первого класса. Причина такого ограничения заключается в том, что компилятор получает достаточные сведения для объявления отдельных дружественных функций только в момент объявления второго класса.
Примечание
Хотя весь второй класс должен быть дружественным для первого класса, можно выбрать, какие функции первого класса будут дружественными для второго класса.