2010-07-24 4 views
2

Ceci est ma première question ici.Un autre 'x n'a pas été déclaré dans cette portée'

Ecrire un code, je reçois cette erreur de g ++: "entité n'a pas été déclarée dans ce cadre", dans ce contexte:

#ifndef Psyco2D_GameManager_ 
#define Psyco2D_GameManager_ 

#include <vector> 
#include "Entity.h" 

namespace Psyco2D{ 
    class GameManager{J 
    private: 
     std::vector<Entity> entities; 
    }; 
} 

#endif 

Ceci est le contenu de Entity.h:

#ifndef Psyco2D_Entity_ 
#define Psyco2D_Entity_ 

#include <string> 
#include "GameManager.h" 
#include "EntityComponent.h" 


namespace Psyco2D{ 

    class Entity{ 
     friend class GameManager; 

    private: 
     /* Identificatore */ 
     std::string _name; 

     /* Components list */ 
     std::map<const std::string, EntityComponent*> components; 

    protected: 
     Entity(const std::string name); 

    public: 
     inline const std::string getName() const{ 
      return this->_name; 
     } 

     void addComponent(EntityComponent* component, const std::string name); 

     EntityComponent* lookupComponent(const std::string name) const; 

     void deleteComponent(const std::string name); 

    }; 

} 

#endif 

Si j'utilise std::vector<class Entity> au lieu de std::vector<Entity> cela fonctionne.

Pourquoi?

Merci à tous =)

+8

Comment devrons-nous deviner ce que '' Entity.h ''contient? – GManNickG

+0

Désolé, j'ai édité le message =) – Sigel

Répondre

4

En supposant que le premier extrait fait partie de GameManager.h, vous avez une dépendance d'en-tête circulaire. Je crois que vous pouvez corriger cela en changeant l'GameManager.h inclure dans Entity.h à class GameManager; à la place.

De plus, comme noté GMan, Entity est dans un espace de noms et vous devez qualifier Entity avec le nom de l'espace de nom.

+0

Ce n'est pas le problème, j'ai dans le pré-processeur d'en-tête GameManager ifndef et définir des directives comme dans Entity.h – Sigel

+0

@Sigel: Il * est * le problème. :) Je vous ai parlé de ma réponse. – GManNickG

7

Le problème est que vous avez une dépendance cyclique. Sortez #include "GameManager.h" dans Entity.h, puisque vous n'en avez pas réellement besoin dans cet en-tête. (Up-vote this answer, qui l'a d'abord souligné.)

Notez que les gardes sont en fait le problème; mais ne les enlevez pas! Vous avez juste besoin de minimiser les inclusions que vous avez, et de déclarer (et non définir) les types lorsque cela est possible. Considérez ce qui se passe lorsque vous incluez Entity.h: Comme un certain point, il comprend GameManager.h, qui à son tour comprend Entity.h. À ce stade, Entity.h a déjà sa garde d'en-tête définie, de sorte qu'il ignore le contenu. Ensuite, l'analyse de GameManager.h continue, où il se heurte à Entity, et se plaint à juste titre qu'il n'est pas défini. (En effet, cela est encore le processus d'inclusion GameManager.h la première inscription de Entity.h, bien avant Entity est défini!)

Notez vos nombreuses modifications démontrent pourquoi il est important d'afficher le code réel, pas de code synthétisé à nouveau. Vous avez besoin de vrais détails pour obtenir de vraies réponses.


Vieux:

Entity est dans l'espace de noms Psyco2D. Vous devez préciser que:

class GameManager{ 
private: 
    std::vector<Psyco2D::Entity> entities; 
}; 
+0

désolé et désolé encore, une partie de code me manque ... La classe de GameManager est dans l'espace de noms de Psyco2D aussi – Sigel

+0

Ehi, cela fonctionne, merci pour l'explication. Je vote la réponse de Mark B parce que, comme vous l'avez dit, je l'ai d'abord signalé. Merci Mark B =) – Sigel

0

Retirez le Psyco2D-espace de nom et il fonctionnera sans déclarer « classe entité ».

Questions connexes