2010-06-23 6 views
0

Je vais avoir un problème lorsque vous essayez de compiler ces deux classes (Armée et générales) dans leurs propres fichiers d'en-tête:inclusion à deux voies de classes et instances de modèle

#ifndef ARMY_H 
#define ARMY_H 

#include "definitions.h" 
#include "UnitBase.h" 
#include "UnitList.h" 
#include "General.h" 

class Army 
{ 
public: 
    Army(UnitList& list);  
    ~Army(void); 

    UnitBase& operator[](const ushort offset); 
    const UnitBase& operator[](const ushort offset) const; 

    const uint getNumFightUnits() const; 
    const ushort getNumUnits() const; 

    const General<Warrior>* getWarrior() const; 

private: 
    UnitBase** itsUnits; 
    uint itsNumFightUnits; 
    ushort itsNumUnits; 
    WarriorGeneral* itsGeneral;  
}; 

#endif 

et

#ifndef GENERAL_H 
#define GENERAL_H 

#include "generalbase.h" 
#include "Warrior.h" 

class Army; 

template <class T> 
class General : public GeneralBase, public T 
{ 
public: 
    General(void); 
    ~General(void); 

    void setArmy(Army& army); 
    const Army& getArmy() const; 

private: 
    Army* itsArmy; 
}; 

typedef General<Warrior> WarriorGeneral; 

#endif 

J'ai essayé de déclarer WarriorGeneral dans Army.h, mais cela ne semble pas fonctionner, peut-être parce que c'est une instance de template? Quoi qu'il en soit, les erreurs que je reçois avec la version ci-dessus sont plusieurs de ce genre et les problèmes connexes:

Army.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

Ils ne sont pas même des problèmes non résolus de l'éditeur de liens ... Notez que je mets le typedef de WarriorGeneral dans le général. h fichier. Je ne sais pas si c'est correct. Y at-il quelque chose qui peut être fait pour que cela fonctionne?

Merci d'avance!

+0

Une chose que je voudrais vous dire est que les destructeurs ne peuvent pas prendre même le «vide» comme argument. Donc '~ Army (void);' et '~ General (void);' sont illégaux. EDIT: Veuillez poster le code complet. –

+1

Quelle est la ligne 21? –

+0

Est-ce que UnitList a été déclaré? –

Répondre

1

Je ne peux pas dire ce que Army.h ligne 21 est parce que celui que vous avez posté n'a pas autant de lignes. La seule chose que je peux voir qui n'est pas déclarée dans cet en-tête est UnitList. Est-il correctement déclaré à l'avance ou avez-vous un en-tête que vous ne nous montrez pas?

Est-ce que generalbase.h ou Warrior.h incluent Army.h? Si oui, cela causerait l'inclusion apparemment circulaire. Essayez de ne pas faire l'inclure mais en avant déclarer Army à la place.

+0

Mis à jour le code pour inclure l'ensemble des fichiers. H, désolé! UnitList est inclus. generalbase.h ne comprend pas Army.h ... laissez-moi voir, merci! –

+0

@Kristian: Que diriez-vous de nous dire exactement ce qu'est la ligne 21 plutôt que de nous faire compter? –

0

Vous pouvez « avant de déclarer » un modèle avec

template <class T> class General; 
0

Avec ce code (à la fois coupé et collé dans le même fichier cpp avec le bit général où l'#include est), il n'y a aucune erreur en utilisant g ++, si vous avez ces trois définis au lieu de #include "generalbase":

struct GeneralBase { }; 
struct Warrior; 
struct UnitList; 

Sans GeneralBase:

src/Army.cpp:13: error: expected class-name before ‘,’ token 
Sans

Guerrier:

src/Army.cpp:26: error: ‘Warrior’ was not declared in this scope 
src/Army.cpp:26: error: template argument 1 is invalid 
src/Army.cpp:26: error: invalid type in declaration before ‘;’ token 

Sans UnitList

src/Army.cpp:32: error: expected ‘)’ before ‘&’ token 

Il est un peu difficile de voir que votre erreur est; peut-être avez-vous défini GENERAL_H par erreur et ne l'incluez-vous pas?

0

Oui, @ Mark B. avait raison! J'ai supprimé Army.h de GeneralBase.h, et il se compile maintenant parfaitement. Cela me fait me demander, cependant, ce qui se passe si je dois inclure Army.h dans GeneralBase ...

+0

Vous n'aurez pas à inclure arbitrairement Army.h; vous aurez une raison spécifique pour laquelle vous voudriez. Sans savoir quelle serait cette raison, nous ne pouvons pas vous aider. Tout ce que nous pouvons dire, c'est que vous devriez être capable de comprendre comment obtenir ce que vous voulez sans inclure. –

Questions connexes