Nach 7.3.1.2 Namespace Mitglied Definitionen in C++ Norm ISO/IEC 14882: 2003 (E)C++ Forward-Deklaration und Freundschaft in Namespace
Jeder Name zuerst in einem Namespace deklariert ist ein Mitglied dieser Namespace . Wenn eine Friend-Deklaration in einer nicht-lokalen Klasse zuerst eine Klasse oder Funktion deklariert (dies bedeutet, dass der Name der Klasse oder Funktion nicht qualifiziert ist), ist die Friend-Klasse oder -Funktion ein Member von der innerste umschließende Namespace.
// 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
}
Seit void h(int);
zuerst im globalen Namespace deklariert ist, ist es ein Mitglied des globalen Namespace. Warum wird die Friend-Deklaration friend void h(int);
in nicht als ::h
betrachtet, sondern als A::h
?
Sie erklären gerade einen void Freund auf der Klasse X. Wenn es etwas anderes tun würde, wäre ich besorgt. void h (int) Vorher wird im globalen Bereich angegeben, Y jedoch eindeutig im Namensbereich A. – Jay