Warum kann ich ein privates Mitglied einer Klasse nicht von einer Freundklasse in einem anderen Namespace ändern?

8

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%     
Jacobo de Vera 14.05.2011, 16:59
quelle

3 Antworten

9
%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.

    
AProgrammer 14.05.2011, 17:03
quelle
5

Weil friend struct S; deklariert N::S class, aber Sie brauchen ::S class.

    
Begemoth 14.05.2011 17:04
quelle
4

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.

    
quelle

Tags und Links