2012-01-15 10 views
0

エラーは、「名前空間ChessGameで詳しく命名ませメンバーではありません推測ここで、関連するコードがC++コンパイラエラー。名前空間の問題私は私が手

ある
//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); 
} 
} 

任意のアイデアみんな

EDIT:。?別の最小限の例:

//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 

、エラーが、これは、複数のファイル間結合を有するので、多分その問題であること

ノート「で宣言されていない識別子の詳細の使用?

+0

構文エラーを修正すると、これはうまくコンパイルされます。 –

+0

これはとても奇妙ですね... – dchhetri

+0

pieceIdはなぜリファレンスですか?文字通りPieceIdでosOccupiedWithEnemyを呼び出すチャンスがありますか? – pezcode

答えて

1

希望する名前を直接指定するには、detail::IChessPieceEnums::PieceIdまたは::ChessGame::detail::IChessPieceEnums::PieceIdのいずれかを指定しますが、好ましくは前者を指定します。しかし、名前が見つからない場合、グローバル名前空間で検索が再開されるため、現在の構文も実際には問題ありません。

+0

私は両方を試してみて、同じエラーを受け取ります。何らかの理由で「詳細」名前空間が見つかりません – dchhetri

+0

構文エラーを修正しましたか?クラス定義の最後にはセミコロンが必要です。 –

+0

はい、それは上記投稿のタイプでした – dchhetri

0

解決策が見つかりました。解決策は、namespaceの詳細をdetail.hという独自のファイルに配置することです。そうすれば、piece.hとboard.hはそれを使うためにdetails.hをインクルードする必要があります。それはうまくいった。

元の投稿の問題は、循環参照があることです。それは何らかの形で問題を引き起こしています。説明が大好きです。

+0

ああ問題はboard.hの前にpiece.hを含めていたことでした。 – dchhetri