2013-04-01 16 views
12

Quindi ho avuto questo problema estremamente frustrante ultimamente con Visual C++ 2012. Fino a poche ore fa, stavo scrivendo il codice bene e tutto funzionava come previsto, fino a quando ha deciso di ottimizzare alcune cose e cancellato alcune classi. Ho corretto tutti gli errori che si stavano verificando a causa di ciò, ad es. false include, ecc. Sfortunatamente, dopo questo il compilatore VS è impazzito. E 'iniziato mi dà errori come ad esempio:Errore del compilatore C2653: non un nome di classe o spazio nomi

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

o anche

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

Ho controllato più volte, e tutto è al suo posto giusto: tutte le intestazioni inclusi, tutti i simboli posti dove dovrebbero essere .

Per quanto ho capito, il problema non è con il mio codice ma con il compilatore stesso ... Visual Studio può essere davvero fastidioso a volte, immagino. Ad ogni modo, sarei davvero grato se qualcuno potesse darmi una mano su questo.

(A proposito, invalidanti intestazioni precompilate fatto non lavoro)

parti rilevanti di codice:

errore 14:

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

Errore 5:

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

Errore 4:

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

intero file PlayerEntity.h:

#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 

intero file GameScreen.h:

#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 

intero file BaseEntity.h:

#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 

intero file Input.h :

#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 

intero file ScreenSystem.h:

#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

Dubito che sia un problema con il compilatore stesso. –

+0

Controlla le chiusure delle dichiarazioni di classe per assicurarti che finiscano con '};' e non solo con '}'; **tutti loro**. Controlla anche il bilanciamento di ciascuna coppia '{', '}'. Poiché chiaramente il contenuto del costruttore PlayerEntity che hai fornito * dovrebbe * essere C++ valido, e poiché l'unica cosa sopra è un'intestazione include, ciò che ti fa pensare che il file include sia ** non ** rilevante e quindi non dovrebbe essere incluso qui per l'esame? – WhozCraig

+2

Fornire un [esempio breve, autonomo e corretto] (http://sscce.org/) – Oswald

risposta

31

Avete una dipendenza circolare nelle tue intestazioni.BaseEntity.h include Input.h, che include ScreenSystem.h, che include GameScreen.h, che a sua volta include nuovamente BaseEntity.h. Ciò porta a visualizzare i nomi delle classi prima che vengano dichiarati, causando un errore di compilazione.

Per evitare questo, non includere le intestazioni inutilmente. Ad esempio, non includere Input.h da BaseEntity.h, poiché non è affatto necessario; e non includere BaseScreen.h da ScreenSystem.h poiché è necessaria solo una dichiarazione class BaseScreen;, non la definizione completa della classe.

Inoltre, controllare di non avere protezioni dell'intestazione duplicate. Alcuni di essi non corrispondono al nome dell'intestazione (ad esempio GHANDLER_H per ScreenSystem.h), il che mi fa pensare che potrebbero essere stati copiati accidentalmente da altre intestazioni. Infine, non utilizzare nomi riservati come _EntitySprite per i propri simboli; per semplicità, evitare di evidenziare o doppi underscore.

+0

@Jakobson: Se ha risolto il tuo problema, accetta la risposta facendo clic sul segno di spunta (e consegni all'uomo se è possibile). +1 da me. –

+0

+1 allo stesso modo. buone parole. – WhozCraig

+0

"duplicate header guards" - d'oh! Mi ci sono voluti anni per trovare questa risposta. – cloudfeet

3

Avete copiato i messaggi di errore nella vostra domanda o li hai digitare di nuovo? Perché l'errore 14 ha 'Classe' con una C maiuscola che non ha quasi certamente ragione.

Inoltre, dovresti utilizzare il minor numero possibile di direttive nei file di intestazione. Ad esempio, GameScreen non usa PlayerEntity, in modo da poter rimuovere il che includono e BaseEntity viene utilizzato solo tramite puntatore in modo da poter sostituire

#include "BaseEntity.h" 

con una dichiarazione anticipata

class BaseEntity; 
Problemi correlati