gcc kann keine Operatordefinition mit vorangestelltem Namespace kompilieren

8

Ich habe Operatoren für die Klasse my_type im Namespace my_namespace deklariert.

%Vor%

Ich versuche, diese Operatoren in der Implementierungsdatei zu definieren, aber wenn ich sowas schreibe

%Vor%

Ich erhalte eine Fehlermeldung

error: ... operator should have been declared inside 'my_namespace'

Wenn ich es zu

ändere %Vor%

dann ist es kompiliert, aber ich verstehe das Problem nicht. Warum konnte das nicht kompiliert werden? Ist damit alles in Ordnung? Ich würde den Link zum Standard schätzen, da ich wirklich nicht weiß, was ich suchen soll.

hinzugefügt

file.h

%Vor%

file.cpp

%Vor%

Hier ist ein vollständiges Beispiel. Dies funktioniert auf VS2010 gut, gibt aber oben genannten Fehler auf gcc 4.4.5.

hinzugefügt

hmm ... ja, das funktioniert

%Vor%

Ich habe immer daran gedacht, dass es im Hinblick auf die Sichtbarkeit, Freund-Operator in der Klasse zu deklarieren, dasselbe ist wie außerhalb der Klasse zu deklarieren ... sieht so aus, als wäre es nicht. Danke.

Vielen Dank im Voraus.

    
ledokol 21.01.2011, 10:47
quelle

2 Antworten

9
  

Die Fehlermeldung sagt eigentlich alles. Sie können Ihre Funktionsdefinition in der Implementierungsdatei behalten, müssen sie jedoch zuerst im Namespace deklarieren:

%Vor%

Der C ++ - Standard ist ziemlich klar:

  

7.3.1.2/3:

     

Jeder Name, der zuerst in einem Namespace deklariert wird, ist ein Mitglied dieses Namespace. Wenn eine Friend-Deklaration in einer nicht-lokalen Klasse zuerst eine Klasse oder Funktion deklariert, ist die Friend-Klasse oder -Funktion ein Member des innersten einschließenden Namespace. Der Name des Freundes wird nicht durch einfache Namenssuche gefunden, bis eine übereinstimmende Deklaration in diesem Namespacebereich bereitgestellt wird (entweder vor oder nach der Klassendeklaration, die Freundschaft gewährt). Wenn eine friend-Funktion aufgerufen wird, kann ihr Name durch die Namenssuche gefunden werden, die Funktionen aus Namespaces und Klassen berücksichtigt, die den Typen der Funktionsargumente zugeordnet sind (3.4.2). Wenn Sie nach einer früheren Deklaration einer Klasse oder einer Funktion suchen, die als Freund deklariert wurde, und wenn der Name der Freundesklasse oder -funktion weder ein qualifizierter Name noch eine Schablonen-ID ist, werden Bereiche außerhalb des innersten umschließenden Namensbereichs nicht berücksichtigt. .

Der folgende Link bringt es einfacher und fügt einige Beispiele hinzu: Ссылка

Also würde ich sagen, dass gcc hier falsch ist. . Der relevante Satz scheint " zu sein Der Name des Freundes wird nicht durch einfache Namenssuche gefunden, bis eine übereinstimmende Deklaration in diesem Namespacebereich bereitgestellt wird (entweder vor oder nach der Klassendeklaration, die Freundschaft gewährt) . p>     

Daniel Gehriger 21.01.2011, 10:52
quelle
1

Erklärungen beziehen sich auf eine Reihe anderer Namen und führen einen einzelnen neuen Namen ein; Dieser neue Name darf nicht mit einer Namespacekennung versehen werden, sondern die Deklaration muss sich innerhalb des Namespaceblocks befinden, in dem der neue Name deklariert werden soll.

Für Definitionen gelten die gleichen Regeln, da sie eine Deklaration implizieren. Die Friend-Deklaration ist etwas Besonderes, weil sie in einer anderen Definition lebt und nichts wirklich deklariert.

    
Simon Richter 21.01.2011 12:33
quelle