2010-10-18 15 views
5

Tenía un proyecto en funcionamiento. Después de reorganizar un poco de código, traté de recompilar mi proyecto y luego comenzaron a suceder cosas extrañas. Eche un vistazo a este extracto de la salida del compilador. Estoy compilando desde Eclipse en Windows usando MinGW G ++.Error: '...' no nombra 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, línea 18:

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

Por lo general, cuando esto sucede, sólo tiene que añadir algunas inclusiones he olvidado de hacer. Pero de hecho he incluido pieza.h en la parte superior de placa.h.

Mi segundo pensamiento fue que el compilador debe haber generado un error en algún lugar de la clase Piece que causaría que el compilador ignore la existencia de la clase, lo que a su vez causaría más errores. En ese caso, miraría el primer error del compilador, que esperaba que fuera un error en pieza.cpp o pieza.h. Sin embargo, el primer error no se trata de Piece es en absoluto, así que miré si había marcado Eclipse cualquier error en piece.cpp o piece.h. No, no hay una línea roja a la vista. Solo vi algunos de these unexplained yellow markers.

Una última cosa que verifiqué fue que cada archivo de encabezado contenía guardias de inclusión, lo cual hicieron.

¿Cómo llego al final de este error? Publicaba fragmentos de código, pero probablemente terminaría pegando todo el código (lo cual no puedo hacer) porque puede ser necesario un contexto adicional.

Editar: aquí está board.h hasta la línea 18. (He dejado de lado un gran comentario, que explica por qué este bloque de código es más pequeña de lo que esperas.)

#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

Al menos publique el encabezado para board.h hasta la línea 18 si la respuesta a continuación de AndreyT no ayuda –

Respuesta

14

Es muy probable que al "reorganizar el código" haya creado una inclusión circular entre board.h y piece.h. Sus archivos de encabezado contienen guardias que evitan la inclusión infinita en tales casos, pero eso no ayudará a compilar las declaraciones.

Compruebe la inclusión circular y vuelva a pensar en la estrategia de inclusión en consecuencia. Si no tiene ninguna dependencia circular entre los tipos, debería poder eliminar la inclusión circular fácilmente. Si tiene la dependencia circular entre los tipos, deberá recurrir a las declaraciones de reenvío para algunos tipos. Intentar incluir archivos de encabezado de forma circular no logrará nada.

+0

+ 1 - aunque 'clase Piece;' encima de esta línea en 'board.h' podría arreglarlo. –

+1

Sí, estás en algo! 'Board' incluye' Piece', que incluye 'Game', que incluye' Board' y eso continúa infinitamente. – Pieter

1

Parece que piece.h y board.h están incluidos entre sí. Si este es el caso intente usar predeclaraciones de ambas clases e incluya los encabezados solo en los archivos cpp

Cuestiones relacionadas