C ++ odd Kompilierfehler: error: ändert Bedeutung von "Object" aus der Klasse "Object"

8

Ich weiß nicht einmal wohin ich damit gehen soll. Google war nicht sehr hilfreich. Wie bei meiner vorherigen Frage. Ich verwende TextMate Command + R, um das Projekt zu kompilieren.

  

game.h: 16: error: Deklaration von 'Player * HalfSet :: Player () const'

     

players.h: 11: error: ändert die Bedeutung von 'Player' von 'class Player'

     

game.h: 21: Fehler: 'Player' ist kein Typ

player.h Datei (teilweise)

%Vor%

game.h Datei (teilweise)

%Vor%

Was ist hier los?

    
epochwolf 12.11.2008, 02:13
quelle

3 Antworten

14

In C ++ können Sie einer Funktion nicht den gleichen Namen wie einer Klasse / struct / typedef geben. Sie haben eine Klasse namens "Player" und daher hat die HalfSet-Klasse eine Funktion namens "Player" ("Player * Player ()"). Du musst einen von diesen umbenennen (wahrscheinlich den Player von HalfSet () in getPlayer () oder so) ändern.

    
SoapBox 12.11.2008, 02:26
quelle
8

Ihr Problem ist, dass Namen in Bereichen nachgeschlagen werden. Innerhalb der Deklaration von HalfSet :: setPlayer (Player *) muss der unqualifizierte Name Player nachgeschlagen werden. Der erste getestete Bereich ist die Klasse HalfSet. In diesem Bereich findet das Nachschlagen von Player die Funktion HalfSet :: Player, nicht global class :: Player.

Die Lösung besteht darin, einen qualifizierten Namen zu verwenden, :: Player. Dies teilt dem Compiler mit, welcher Bereich für das Nachschlagen (global) verwendet werden soll, was wiederum bedeutet, dass HalfSet :: Player nicht einmal berücksichtigt wird.

    
MSalters 12.11.2008 09:57
quelle
5

Die aktuelle Antwort auf diese Frage ist nur falsch, es heißt:

  

In C ++ können Sie einer Funktion nicht denselben Namen geben wie einer Klasse / struct / typedef

Das Verbergen einer Klasse durch eine Funktion ist erlaubt, wenn wir zu Entwurf Pre C ++ 11 Standard Abschnitt 3.3.7 Name versteckt es heißt:

  

Ein Klassenname (9.1) oder Aufzählungsname (7.2) kann durch den Namen ausgeblendet werden   eines Objekts, einer Funktion oder eines Enumerators, die im selben Bereich deklariert sind. Wenn ein   Klassen- oder Enumerationsname und ein Objekt, eine Funktion oder ein Enumerator sind   im selben Umfang (in beliebiger Reihenfolge) mit dem gleichen Namen deklariert, der   Der Name der Klasse oder der Aufzählung ist überall dort versteckt, wo das Objekt, die Funktion oder der Name steht   Der Name des Enumerators ist sichtbar.

Also die Tatsache, dass Sie die Funktion und eine Klasse namens Player haben, ist nicht das Problem, tatsächlich ist der folgende Code gültig:

%Vor%

und wir können einen ausgearbeiteten Typspezifikator verwenden, um Verstecke den Klassentyp.

Soweit ich feststellen kann, verletzt dies den Abschnitt 3.3.6 Klassenbereich Absatz 2 , der besagt:

  

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.

Also in diesem Fall ändert Player die Bedeutung von Klasse in eine Funktion , es ist nicht klar, dass es so streng gemeint war, aber ich kann sehen, wie es geht so gelesen werden. Dies scheint die Nachricht zu sein, die gcc verwendet, wenn sie diesen Verstoß erkennt, wie wir an einer ähnlichen Frage sehen können.

Die Verwendung eines ausgearbeiteten Typenbezeichners verhindert die Änderung der Bedeutung:

%Vor%     
Shafik Yaghmour 02.11.2014 03:30
quelle

Tags und Links