Erreur: ‘…’ ne nomme pas un type

J’ai eu un projet de travail. Après avoir réarrangé du code, j’ai essayé de recomstackr mon projet, puis des choses étranges ont commencé. Regardez cet extrait de la sortie du compilateur. Je comstack depuis Eclipse sous Windows en utilisant MinGW G ++.

**** Build of configuration Debug for project Pract2 **** **** Internal Builder is used for build **** g++ -O0 -g3 -Wall -c -fmessage-length=0 -omove.o ..\move.cpp In file included from ..\/game.h:11:0, from ..\/piece.h:10, from ..\/move.h:10, from ..\move.cpp:7: ..\/board.h:18:2: error: 'Piece' does not name a type 

board.h , ligne 18:

 Piece* GetPieceAt(int row, int col) const; 

Habituellement, lorsque cela se produit, je dois simplement append certaines inclusions que j’ai oubliées de faire. Mais j’ai en fait inclus morceau.h en haut du tableau .

Ma deuxième pensée a été que le compilateur doit avoir généré une erreur quelque part dans la classe Piece qui le ferait ignorer l’existence de la classe, ce qui provoquerait davantage d’erreurs. Dans ce cas, je regarderais la première erreur du compilateur, ce à quoi je m’attendais, ressemblait à une erreur dans piece.cpp ou piece.h . Mais la première erreur ne concerne pas du tout Piece . J’ai donc cherché à savoir si Eclipse avait marqué des erreurs dans piece.cpp ou piece.h . Non, pas une ligne rouge en vue. Je n’ai vu que quelques-uns de ces marqueurs jaunes inexpliqués .

Une dernière chose que j’ai vérifiée était que chaque fichier d’en-tête contenait des gardes d’inclusion, ce qu’ils ont fait.

Comment puis-je aller au fond de cette erreur? Je publierais des extraits de code, mais je finirais probablement par coller le code entier (ce que je ne peux pas faire) car un contexte supplémentaire peut être nécessaire.

Edit : voici board.h jusqu’à la ligne 18. (J’ai laissé un grand commentaire, cela explique pourquoi ce bloc de code est plus petit que prévu.)

 #ifndef BOARD_H_ #define BOARD_H_ #include "piece.h" class Board { public: // Prototypes for externally defined functions Board(); ~Board(); void PrintBoard(); Piece* GetPieceAt(int row, int col) const; 

Très probablement, en “réorganisant votre code”, vous avez créé une inclusion circulaire entre board.h et piece.h . Vos fichiers d’en-tête contiennent des gardes qui empêchent l’inclusion infinie dans de tels cas, mais cela ne facilitera pas la compilation des déclarations.

Vérifiez l’inclusion circulaire et repensez votre stratégie d’inclusion en conséquence. Si vous n’avez aucune dépendance circulaire entre les types, vous devriez pouvoir éliminer facilement l’inclusion circulaire. Si vous avez la dépendance circulaire entre les types, vous devrez recourir à des déclarations de transfert pour certains types. Tenter d’inclure des fichiers d’en-tête de manière circulaire n’apportera rien.

Il semble que morceau.h et board.h sont inclus l’un par l’autre. Si c’est le cas, essayez d’utiliser les prédéclarations des deux classes et d’inclure les en-têtes uniquement dans les fichiers cpp.