2013-04-01 7 views
12

So hatte ich in letzter Zeit mit Visual C++ 2012 dieses extrem frustrierende Problem. Bis vor ein paar Stunden habe ich Code geschrieben und alles lief wie geplant, bis ich beschlossen, einige Dinge zu optimieren und löschte ein paar Klassen. Ich habe alle Fehler behoben, die dadurch aufgetreten sind, z. false includes, etc. Leider ist der VS-Compiler danach verrückt geworden. Es begann mir Fehler wie geben:Compilerfehler C2653: kein Klassen- oder Namespacename

Error 14 error C2653: 'Class' : is not a class or namespace name 

oder sogar

Error 5 error C2143: syntax error : missing ';' before '}' 
Error 4 error C2059: syntax error : '>' 

Ich habe mehrmals überprüft, und alles ist in es richtig ist: alle Header enthalten, alle Symbole platziert, wo sie sein sollten .

Soweit ich verstehe, ist das Problem nicht mit meinem Code, sondern mit dem Compiler selbst ... Visual Studio kann manchmal wirklich nervig sein, denke ich. Wie auch immer, ich wäre wirklich dankbar, wenn mir jemand dabei helfen könnte.

(By the way, deaktivieren vorkompilierte Header hat nicht Arbeit)

Relevante Teile des Codes:

Error 14:

#include "PlayerEntity.h" 
PlayerEntity::PlayerEntity(void) {} // This line causes the error 

Fehler 5:

class GameScreen : public BaseScreen 
{ 
public: 
    ... 
private: 
    ... 
}; // This line causes the error 

Fehler 4:

private: 
    std::vector<BaseEntity*> _EntityList; // This line causes the error 

Whole PlayerEntity.h Datei:

#ifndef PENTITY_H 
#define PENTITY_H 

#include "BaseEntity.h" 

class PlayerEntity : public BaseEntity 
{ 
public: 
    PlayerEntity(void); 
    PlayerEntity(float, float); 
    virtual ~PlayerEntity(void); 

    void render(sf::RenderWindow&); 
    void update(); 
private: 
    void init(); 
}; 

#endif 

Whole GameScreen.h Datei:

#ifndef GSCREEN_H 
#define GSCREEN_H 

#include "BaseScreen.h" 
#include "BaseEntity.h" 
#include "PlayerEntity.h" 

class GameScreen : public BaseScreen 
{ 
public: 
    GameScreen(sf::Vector2u&); 
    virtual ~GameScreen(void); 

    void start(); 
    void stop(); 

    void render(sf::RenderWindow&); 
    void update(void); 

    void addEntity(BaseEntity*); 
    void destoryEntity(int id); 
private: 
    std::vector<BaseEntity*> _EntityList; 
    sf::Vector2u _ScreenDimensions; 
}; 

#endif 

Whole BaseEntity.h Datei:

#ifndef BSENTITY_H 
#define BSENTITY_H 

#include "Input.h" 
#include <SFML/Graphics.hpp> 

class BaseEntity 
{ 
public: 
    BaseEntity(void); 
    virtual ~BaseEntity(void); 

    sf::Vector2f position; 

    virtual void update(void); 
    virtual void render(sf::RenderWindow&); 
    void compare(BaseEntity*); 
protected: 
    sf::Texture *_EntityTexture; 
    sf::Sprite _EntitySprite; 

    bool _isAlive; 
    int _id; 

    virtual void init(); 
}; 

#endif 

Whole Input.h Datei :

#ifndef INPUT_H 
#define INPUT_H 

#include "ScreenSystem.h" 
#include <SFML/Window.hpp> 

class Input 
{ 
public: 
    Input(void); 
    Input(sf::RenderWindow*); 
    virtual ~Input(void); 

    static bool keyPressed(int); 
    static bool keyReleased(int); 

    static bool mouseHeld(int); 
    static bool mouseReleased(int); 
private: 
    static sf::RenderWindow *_Window; 
}; 

#endif 

Whole ScreenSystem.h Datei:

#ifndef GHANDLER_H 
#define GHANDLER_H 

#include "BaseScreen.h" 
#include "MenuScreen.h" 
#include "GameScreen.h" 
#include <SFML/Window.hpp> 

class ScreenSystem 
{ 
public: 
    ScreenSystem(void); 
    ScreenSystem(sf::RenderWindow*); 
    virtual ~ScreenSystem(void); 

    BaseScreen *getCurrentScreen(void); 
    void setScreen(int); 
private: 
    int _currentScreenID; 

    std::vector<BaseScreen*> _Screens; 
    sf::RenderWindow *_Window; 
}; 

#endif 
+4

Ich bezweifle, dass es ein Problem mit dem Compiler selbst ist. –

+0

Überprüfen Sie die Schließungen Ihrer Klassendeklarationen, um sicherzustellen, dass sie mit '};' enden und nicht nur mit '}'; **alle von ihnen**. Überprüfen Sie auch das Gleichgewicht jedes einzelnen '{', '}' Paares. Da der Inhalt des PlayerEntity-Konstruktors, den Sie * zur Verfügung gestellt haben, * eindeutig C++ sein sollte und da nur ein Header-Include vorhanden ist, was Sie möglicherweise glauben macht, dass die Include-Datei ** nicht ** relevant ist und daher nicht enthalten sein sollte hier zur Untersuchung? – WhozCraig

+2

Bitte geben Sie ein [kleines, eigenständiges, korrektes Beispiel] (http://sscce.org/) – Oswald

Antwort

31

Sie haben eine zirkuläre Abhängigkeit ersetzen in deinen Kopfzeilen.BaseEntity.h enthält Input.h, die ScreenSystem.h enthält, die GameScreen.h enthält, die wiederum BaseEntity.h enthält. Dies führt dazu, dass Klassennamen vor ihrer Deklaration angezeigt werden, was zu einem Kompilierungsfehler führt.

Um dies zu vermeiden, fügen Sie keine Header unnötigerweise ein. Geben Sie beispielsweise Input.h nicht von BaseEntity.h ein, da es überhaupt nicht benötigt wird. und nicht BaseScreen.h von ScreenSystem.h, da nur eine Deklaration class BaseScreen; benötigt wird, nicht die vollständige Klassendefinition.

Überprüfen Sie auch, dass Sie keine doppelten Header-Wächter haben. Einige von ihnen stimmen nicht mit dem Kopfzeilennamen überein (z. B. GHANDLER_H für ScreenSystem.h), was mich glauben lässt, dass sie versehentlich aus anderen Kopfzeilen kopiert wurden. Schließlich, verwenden Sie keine reservierten Namen wie _EntitySprite für Ihre eigenen Symbole; Der Einfachheit halber vermeiden Sie führende oder doppelte Unterstriche.

+0

@Jakobson: Wenn es Ihr Problem gelöst hat, akzeptieren Sie die Antwort, indem Sie auf das Häkchen klicken (und geben Sie dem Mann eine Aufwertung, wenn Sie können). +1 von mir. –

+0

+1 ebenfalls. gute Worte. – WhozCraig

+0

"duplicate header guards" - d'oh! Nahm mich, um diese Antwort zu finden. – cloudfeet

3

Haben Sie die Fehlermeldungen in Frage kopieren oder Sie sie haben erneut eingeben? Weil Fehler 14 "Klasse" mit einem Kapital C hat, das mit ziemlicher Sicherheit nicht richtig ist.

Auch sollten Sie so wenig include-Direktiven in Ihren Header-Dateien wie möglich verwenden. Zum Beispiel ist GameScreen nicht PlayerEntity verwenden, so können Sie entfernen, die umfassen und BaseEntity nur über Zeiger verwendet, so dass Sie

#include "BaseEntity.h" 

mit einer Vorwärtsdeklaration

class BaseEntity; 
Verwandte Themen