2010-10-18 15 views
5

Ich hatte ein funktionierendes Projekt. Nachdem ich etwas Code umgeordnet hatte, versuchte ich mein Projekt neu zu kompilieren und dann begannen seltsame Dinge zu passieren. Sehen Sie sich diesen Auszug aus der Ausgabe des Compilers an. Ich kompiliere von Eclipse unter Windows mit MinGW G ++.Fehler: '...' nennt keinen Typ

**** 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, Zeile 18:

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

Normalerweise, wenn das passiert, muss ich nur noch einige Einschlüsse hinzufügen ich habe vergessen zu. Aber ich habe in der Tat enthalten piece.h an der Spitze board.h.

Mein zweiter Gedanke war, dass der Compiler irgendwo in der Piece Klasse einen Fehler generiert haben muss, der dazu führen würde, dass der Compiler die Existenz der Klasse ignoriert, was wiederum mehr Fehler verursachen würde. In diesem Fall würde ich den ersten Compiler-Fehler betrachten, von dem ich erwartete, dass er etwas über einen Fehler in piece.cpp oder piece.h sein würde. Aber der erste Fehler ist überhaupt nicht über Piece, so dass ich sah, ob Eclipse irgendwelche Fehler in piece.cpp oder piece.h markiert hatte. Nein, keine rote Linie in Sicht. Ich habe nur ein paar von these unexplained yellow markers gesehen.

Eine letzte Sache, die ich überprüft habe, war, dass jede Header-Datei Inklusionswachen enthielt, was sie taten.

Wie komme ich auf den Grund dieses Fehlers? Ich würde Code-Snippets posten, aber dann würde ich wahrscheinlich den ganzen Code einfügen (was ich nicht kann), weil zusätzlicher Kontext notwendig sein könnte.

bearbeiten: hier ist board.h bis 18. zu Linie (Ich habe einen großen Kommentar ausgelassen, die, warum dieser Code-Block erklärt kleiner als man erwarten würde.)

#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; 
+0

mindestens die Überschrift für board.h bis Zeile 18, wenn die Antwort unten von AndreyT hilft nicht –

Antwort

14

Wahrscheinlich haben Sie durch "Umordnen Ihres Codes" einen kreisförmigen Einschluss zwischen board.h und piece.h erstellt. Ihre Header-Dateien enthalten Wächter, die in solchen Fällen eine unendliche Inklusion verhindern. Dies hilft jedoch nicht bei der Kompilierung der Deklarationen.

Auf zirkuläre Inklusion prüfen und Ihre Einschlussstrategie entsprechend überdenken. Wenn Sie keine zirkulären Abhängigkeiten zwischen den Typen haben, sollten Sie in der Lage sein, die zirkuläre Inklusion einfach zu eliminieren. Wenn Sie die zirkuläre Abhängigkeit zwischen den Typen haben, müssen Sie für einige Typen auf Weiterleitungsdeklarationen zurückgreifen. Der Versuch, Header-Dateien in zirkulärer Form einzufügen, wird nichts erreichen.

+0

+ 1 - obwohl 'class Piece;' über dieser Zeile in 'board.h' das Problem beheben könnte. –

+1

Ja, du bist auf etwas! "Board" beinhaltet "Piece", welches "Game" beinhaltet, welches "Board" beinhaltet und das unendlich weiter geht. – Pieter

1

Es scheint, dass piece.h und board.h von einander enthalten sind. Wenn dies der Fall ist versuchen Sie, Vorverzerrungen beider Klassen zu verwenden und die Header nur in den cpp-Dateien