Siehe mein erster Versuch, dies zu beantworten . Ich habe es versäumt, die ganze Geschichte vorher zu erzählen, um die Dinge zu vereinfachen. Stellt sich heraus mein Beispiel funktioniert! Entschuldigung.
Die ganze Geschichte ist, dass dies eine Bibliothek ist, die eine Klasse in einer Datei und die Hauptdatei in einer anderen Datei enthält, die alle in meine Bibliothek eingebunden sind. Die Bibliothek stellt die Grundlage für ein Prozess-Framework dar, weshalb der Hauptteil in der Bibliothek und nicht im Prozess liegt.
Unten ist eine abgespeckte Version von dem, was ich habe.
pf.hpp
%Vor%pf.cpp
%Vor%pfmain.cpp
%Vor%Beachten Sie, dass dies beim Kompilieren der Bibliothek fehlschlägt.
Was ich versucht habe, ist:
Was vermisse ich?
Danke!
Deklarieren Sie einfach die Hauptdatei außerhalb von MyNamespace
und geben Sie den globalen Namespace ::
in der friend-Anweisung
@parapura hat eine Lösung bereitgestellt, erklärt aber nicht warum Sie zuerst main
im globalen Gültigkeitsbereich deklarieren müssen.
§7.3.1.2 [namespace.memdef] p3
[...] Wenn eine
friend
-Deklaration in einer nichtlokalen Klasse zuerst eine Klasse oder Funktion deklariert, ist die Friend-Klasse oder -Funktion ein Member des innersten einschließenden Namespace. [...]
In diesem Sinne würde Ihr Code ungefähr so aussehen:
%Vor% Jetzt sollte es klar sein, warum die globale main
Funktion nicht dein Freund war.
Eine allgemeine Antwort könnte darin bestehen, eine "Anwendungs" -Singleton-Klasse bereitzustellen, wie z.B. QApplication in Qt, und reduzieren Sie Ihre main
auf etwas wie
Dann reduzierst du dein Freundschaftsinteresse auf class YourApplication
gegenüber deinen anderen Klassen und du weißt, wie das geht.
Ich glaube nicht, dass Sie wirklich tun wollen, was Sie tun. Das scheint wirklich ein Hack- und Designproblem zu sein. Wenn Sie die Interna Ihrer Klasse wirklich unter bestimmten Umständen offen legen wollen, könnten Sie eine Accessor-Klasse erstellen, die ebenfalls in Ihrer Bibliothek definiert ist.
So etwas könnte funktionieren (möglicherweise müssen Vorwärtsdeklarationen usw. verwendet werden - dies ist nur ein Anfangspunkt):
%Vor%