Как использовать / получить доступ к функции внутреннего друга класса в с ++? - PullRequest
2 голосов
/ 18 июня 2020

Мы можем объявить и определить функцию друга внутри класса, как показано ниже

class C
{
    friend void F() {cout<<"inner friend func"<<endl;}
};

как получить доступ / использовать это развлечение внутреннего друга c?

C::F() //error: 'F' is not a member of 'C'
C().F()//error: 'class C' has no member named 'F'

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Знак друга объявляет F() как функцию, не являющуюся членом, тогда и C::F(), и C().F() не будут работать. И вы должны добавить объявление в область пространства имен для его вызова, потому что оно не отображается для поиска имени (кроме ADL , но F() не принимает параметров, тогда ADL для него не работает).

Имя, впервые объявленное в объявлении друга в классе или шаблоне класса X, становится членом самого внутреннего включающего пространства имен X, но не отображается для поиска (кроме поиска, зависящего от аргументов, который учитывает X ), если не предоставлено соответствующее объявление в области пространства имен

и

Имена, введенные объявлениями friend в нелокальном классе X, становятся членами самого внутреннего охватывающего пространства имен X, но они не становятся видимыми для обычного поиска имени (ни неквалифицированный , ни квалифицированный ), если в пространстве имен не указано соответствующее объявление область видимости до или после определения класса. Такое имя можно найти через ADL , который учитывает как пространства имен, так и классы.

Например,

void F();
class C
{
    friend void F() {cout<<"inner friend func"<<endl;}
};

Затем назовите его как

F();

ЖИВОЙ

1 голос
/ 18 июня 2020

Объявление функции как друга не делает ее частью класса. Вам нужно объявить это снаружи:

#include <iostream>

using std::cout;
using std::endl;

class C
{
    friend void F() {cout<<"inner friend func"<<endl;}
};

void F();

int main() {
    F();
}

Или лучше, поместите также определение вне класса.

...