Ich finde Probleme beim Zugriff auf ein privates Mitglied einer Klasse aus einer Freundklasse.
Die Klasse, die das private Member enthält, das ich ändern möchte, und die Klasse, in der die Änderung vorgenommen wird, befinden sich in verschiedenen Namespaces.
Die Freundklasse wird nach der Klasse definiert, die die Daten enthält. Daher habe ich versucht, die Friend-Klasse außerhalb des Namespace weiterzuleiten.
g ++ sagt, dass ich das Mitglied nicht ändern kann, weil es privat ist, Visual Studio scheint zu denken, dass es in Ordnung ist.
Mache ich hier irgendwas Ungewöhnliches? Warum kann ich das Mitglied nicht wechseln? Hier ist ein vereinfachtes Snippet, das mein Problem darstellt:
%Vor%Was machen Sie wirklich mit
? %Vor%deklariert als Freund die Klasse N :: S (die nirgendwo definiert ist).
Bearbeiten: Um meine Idee zu sichern, dass gcc-Verhalten korrekt ist und VC ++ einen Fehler hat.
7.3.1.2/3
Wenn eine
friend
-Deklaration in einer nicht-lokalen Klasse zuerst eine Klasse oder deklariert Funktion Die Freundesklasse oder Funktion ist ein Mitglied des Innersten Einschließender Namespace. [...] Bei der Suche nach einer vorherigen Erklärung eines Klasse oder Funktion, die von einer Friend - Deklaration eingeführt wird, Bereiche außerhalb der Der innerste einschließende Namespace-Bereich wird nicht berücksichtigt.
Versuchen Sie, friend struct ::S;
auszugeben.
Momentan wird das nicht vorhandene N::S
angenommen. Dieser Fix gibt den globalen Namespace an, ähnlich wie der führende /
in einem Linux-Pfad den Dateisystemstamm angibt.
Tags und Links c++