2010-10-18 10 views
5

Ho avuto un progetto di lavoro. Dopo aver riordinato un po 'di codice, ho provato a ricompilare il mio progetto e poi sono iniziate le cose strane. Dai un'occhiata a questo estratto dall'output del compilatore. Sto compilando da Eclipse su Windows usando MinGW G ++.Errore: '...' non indica un tipo

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

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

Di solito, quando ciò accade, devo solo aggiungere alcune inclusioni che ho dimenticato di fare. Ma in effetti ho incluso piece.h nella parte superiore di board.h.

Il mio secondo pensiero è stato che il compilatore deve aver generato un errore da qualche parte nella classe Piece che avrebbe causato il compilatore ignorare l'esistenza della classe, che a sua volta avrebbe causato più errori. In tal caso guarderei il primo errore del compilatore, che mi aspettavo sarebbe qualcosa su un errore in piece.cpp o piece.h. Ma il primo errore non è affatto su Piece, quindi ho cercato se Eclipse avesse contrassegnato eventuali errori in piece.cpp o piece.h. No, non una linea rossa in vista. Ho visto solo alcuni dei these unexplained yellow markers.

Un'ultima cosa che ho controllato era che ogni file di intestazione conteneva guardie di inclusione, cosa che facevano.

Come si arriva in fondo a questo errore? Pubblicherei frammenti di codice, ma poi probabilmente finirei per incollare l'intero codice (cosa che non posso fare) perché potrebbe essere necessario un contesto aggiuntivo.

Edit: ecco board.h fino alla linea 18. (Ho lasciato fuori un grande commento, che spiega il motivo per cui questo blocco di codice è più piccolo di quanto si aspetterebbe.)

#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

Almeno inserisci l'intestazione per board.h fino alla riga 18 se la risposta di seguito di AndreyT non aiuta –

risposta

14

Molto probabilmente "riordinando il tuo codice" hai creato un inserimento circolare tra board.h e piece.h. I file di intestazione contengono protezioni che impediscono l'inclusione infinita in questi casi, ma ciò non aiuterà le dichiarazioni a compilare.

Verificare l'inclusione circolare e ripensare la strategia di inclusione di conseguenza. Se non si dispone di alcuna dipendenza circolare tra i tipi, si dovrebbe essere in grado di eliminare facilmente l'inclusione circolare. Se si dispone della dipendenza circolare tra i tipi, è necessario ricorrere alle dichiarazioni di inoltro per alcuni tipi. Il tentativo di includere i file di intestazione in modo circolare non otterrà alcun risultato.

+0

+ 1 - anche se 'class Piece;' sopra questa riga in 'board.h' potrebbe risolverlo. –

+1

Sì, sei su qualcosa! 'Board' include' Piece', che include 'Game', che include' Board' e che continua all'infinito. – Pieter

1

Sembra che piece.h e board.h siano inclusi l'uno dall'altro. Se questo è il caso prova a utilizzare le predeclarazioni di entrambe le classi e includi le intestazioni solo nei file cpp

Problemi correlati