według 7.3.1.2 definicje członkowskie nazw w C++ standard ISO/IEC 14882: 2003 (E)C++ deklaracja Forward i Przyjaźni w obszarze nazw
Każda nazwa pierwsza zadeklarowana w przestrzeni nazw jest członkiem tej nazw . Jeśli deklaracja znajomego w klasie nielokalnej najpierw deklaruje klasę lub funkcję (co oznacza, że nazwa klasy lub funkcja jest niekwalifikowalna), klasa lub funkcja przyjaciela jest członkiem najgłębiej otaczającej przestrzeni nazw.
// Assume f and g have not yet been defined.
void h(int);
template <class T> void f2(T);
namespace A {
class X {
friend void f(X); // A::f(X) is a friend
class Y {
friend void g(); // A::g is a friend
friend void h(int); // A::h is a friend
// ::h not considered
friend void f2<>(int); // ::f2<>(int) is a friend
};
};
// A::f, A::g and A::h are not visible here
X x;
void g() { f(x); } // definition of A::g
void f(X) { /* ... */} // definition of A::f
void h(int) { /* ... */ } // definition of A::h
// A::f, A::g and A::h are visible here and known to be friends
}
Od void h(int);
najpierw deklarowane w globalnej przestrzeni nazw, jest członkiem globalnej przestrzeni nazw. Dlaczego deklaracja przyjaciela jest bardziej szczegółowa niż A::h
, a nie ?
Po prostu deklarujesz voidowi przyjaciela na X klasie. Gdyby zrobił coś jeszcze, byłbym zmartwiony. void h (int) Deklarowane wcześniej jest w globalnym, ale Y jest wyraźnie w przestrzeni nazw A. – Jay