2012-01-15 2 views
0

L'erreur que je reçois est « Aucun membre nommé en détail dans l'espace de noms Chessgame Voici le code correspondantErreur de compilateur C++; question Namespace Je suppose que

//ChessPiece.h 
namespace ChessGame 
{ 

class ChessBoard; 

namespace detail 
{ 
    class IChessPieceEnums{ 
    public: 
     enum PieceType{PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING}; 
     enum PieceDirection{ UP = 1 , DOWN = -1}; 
     enum PieceId{ WHITE_PIECE_ID, BLACK_PIECE_ID }; 
    }; 
} 

//represents an abstract chess piece interface 
class IChessPiece : public detail::IChessPieceEnums 
{ 
public: 
///... 
} 

} // end namespace 


//GameBoard.h 
#include "ChessPiece.h" 
namespace ChessGame 
{ 

class IChessPiece; 

class ChessBoard 
{ 
    public: 
    /*********ERROR OCCURS ON THIS FUNCTION************/ 
    bool isOccupiedWithEnemy(int row, int col,const ChessGame::detail::IChessPieceEnums::PieceId& pieceId); 
} 
} 

Tous les gars idée

EDIT:.? Un autre exemple minimal:

//Piece.h

#ifndef TestProject_C___Piece_h 
#define TestProject_C___Piece_h 

#include "Board.h" 

namespace Foo { 
namespace detail{ 
    struct PieceEnums{ 
     enum PieceID{ ID1, ID2 }; 
    }; 
} 

class Board; 

class Piece{ 
public: 
    void foo(Board& b)const; 
}; 
} 
#endif 

//board.h

#ifndef TestProject_C___Board_h 
#define TestProject_C___Board_h 

#include "Piece.h" 


namespace Foo { 
class Piece; 

class Board{ 
    bool isOcc(int x, int y,const detail::PieceEnums::PieceID pid)const; 
}; 
} 

#endif 

Et l'erreur est « Utilisation de détails d'identification non déclaré

Notez que ceci est dans plusieurs fichiers, alors peut-être un problème avec son lien?

+0

Correction des erreurs de syntaxe, cela compile bien. –

+0

C'est tellement bizarre ... – dchhetri

+0

Pourquoi pieceId est-il une référence? Êtes-vous par hasard en appelant osOccupiedWithEnemy avec un PieceId littéral? – pezcode

Répondre

1

Pour spécifier directement le nom souhaité, dites detail::IChessPieceEnums::PieceId ou ::ChessGame::detail::IChessPieceEnums::PieceId, mais de préférence le premier. Toutefois, votre syntaxe actuelle est également correcte, car la recherche reprend dans l'espace de noms global si un nom est introuvable.

+0

J'ai essayé les deux et obtenir la même erreur. Il ne trouve pas l'espace de noms 'detail' pour une raison quelconque – dchhetri

+0

Avez-vous corrigé vos erreurs de syntaxe? Vous avez besoin de points-virgules à la fin des définitions de classe. –

+0

Oui, c'était un type dans le message ci-dessus – dchhetri

0

Ok trouvé une solution. La solution consiste à placer le détail de l'espace de noms dans son propre fichier appelé detail.h. De cette façon, piece.h et board.h doivent inclure details.h pour l'utiliser. Ça a marché.

Et le problème avec le message original est qu'il y a une référence circulaire. Cela cause des problèmes en quelque sorte. J'adorerais une explication.

+0

Oh le problème était que j'inclus piece.h avant board.h, j'avais besoin de les changer. – dchhetri