Warum benötigt eine C ++ - Freundesklasse nur in anderen Namespaces eine Forward-Deklaration?
Angenommen ich habe eine Klasse F
sollte sein Freund zu den Klassen G
(global namespace) und C
(im namespace A
).
- Freund zu
A::C
F
muss nach vorn erklärt. - Freund zu
G
keine vorwärts-Deklaration vonF
notwendig ist. - ebenfalls eine Klasse
A::BF
können Freund zuA::C
ohne forward-Deklaration
Der folgende code veranschaulicht diese und kompiliert mit GCC-4.5, VC++ 10 und zumindest mit einem anderen compiler.
class G {
friend class F;
int g;
};
//without this forward declaration, F can't be friend to A::C
class F;
namespace A {
class C {
friend class ::F;
friend class BF;
int c;
};
class BF {
public:
BF() { c.c = 2; }
private:
C c;
};
} //namespace A
class F {
public:
F() { g.g = 3; c.c = 2; }
private:
G g;
A::C c;
};
int main()
{
F f;
}
Dies erscheint mir inkonsistent. Gibt es einen Grund dafür oder ist es nur eine design-Entscheidung der standard?
InformationsquelleAutor der Frage pesche | 2010-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++
StandardISO/IEC 14882:2003(E)
7.3.1.2 Namespace Mitglied Definitionen
Absatz 3
Ihre
friend class BF;
ist eine Erklärung derA::BF
im namespace eher als global namespace. Sie müssen die Globale vor-Deklaration zu vermeiden, diese neue Erklärung.InformationsquelleAutor der Antwort Alexey Malistov
Let ' s take in Konto diese 3 Zeilen code aus deinem Beispiel:
C++ standard in Absatz 7.3.1.2, Punkt 3 ( Namespace Mitglied Definitionen) sagt:
Und Zeile 2 folgt genau das, was standard erfordert.
Aller Verwirrung ist, weil "Freund-Erklärung" ist schwachdie Sie benötigen, zu liefern solide vorwärts-Deklaration für die weitere Verwendung.
InformationsquelleAutor der Antwort tomekpe
Da würde es keinen Sinn machen in der Lage sein zu erklären, etwas in den global namespace auf, wenn Sie sich in einem
namespace {}
block. Der Grundfriend class BF;
funktioniert, ist, dass es wirkt wie eine implizite forward-Deklaration.InformationsquelleAutor der Antwort Billy ONeal