Kann ein Mitglied einer Klasse denselben Namen wie sein Typ (eine andere Klasse) haben?

8

Wenn ich versuche, den folgenden Code für verschiedene Compiler zu kompilieren, ergeben sich zwei verschiedene Ergebnisse:

%Vor%

Wie Sie sehen können, habe ich in T ein Objekt, das genauso benannt ist wie die zuvor definierte Klasse S .

In GCC 4.7.2, bekomme ich den folgenden Fehler bezüglich der S S; Deklaration in T :

  

Fehler: Deklaration von 'S T :: S' [-pffmissiv]
   error: ändert die Bedeutung von 'S' von 'struct S' [-fpermissiv]

Allerdings funktioniert es außerhalb der Klasse (oder in main ) funktioniert gut :

%Vor%

Was genau bedeutet es durch den Fehler, den es mir gibt?

In Visual Studio 2012 wird das Ganze kompiliert und ohne Fehler ausgeführt. Das Einfügen in den Clang 3.0-Compiler gibt mir auch keine Fehler.

Was ist richtig? Kann ich das tatsächlich tun oder nicht?

    
chris 17.10.2012, 21:22
quelle

3 Antworten

14

gcc ist korrekt, aus [3.3.7 Klassenbereich]

  

Ein Name N, der in einer Klasse S verwendet wird, muss sich auf dieselbe Deklaration beziehen   Kontext und wenn sie in dem abgeschlossenen Umfang von S. Nr   Für einen Verstoß gegen diese Regel ist eine Diagnose erforderlich.

Beachten Sie jedoch, dass no diagnostic is required , also alle Compiler konform sind.

Der Grund liegt in der Funktionsweise des Klassenbereichs. Wenn Sie% co_de schreiben% S S; ist innerhalb der gesamten -Klasse sichtbar und ändert die Bedeutung, wenn Sie S verwenden.

%Vor%     
Jesse Good 17.10.2012, 21:34
quelle
6

Dieser Code ist schlecht formatiert, keine Diagnose erforderlich. Wie die Diagnose sagt, wenn eine Deklaration einen Namen verwendet und der Name eine andere Bedeutung hat, als wenn er am Ende der Klassendefinition nachgeschlagen wurde, ist das Programm fehlerhaft, es ist keine Diagnose erforderlich.

    
Johannes Schaub - litb 17.10.2012 21:34
quelle
6

@JesseGood liefert eine vollständige Antwort, aber wenn Sie dies wirklich ohne Fehler tun möchten, können Sie den vollständigen Namen des Typs verwenden und er wird wie folgt funktionieren:

%Vor%

Nein, es gibt keinen Fehler, da S in Ihrer Klasse T::S ist und sein Typ ::S !

ist     
BigBoss 17.10.2012 22:38
quelle