Ошибка компилятора C ++; Я думаю, проблема с пространством имен - PullRequest
0 голосов
/ 15 января 2012

Я получаю сообщение об ошибке: «Нет элемента с именем detail в пространстве имен ChessGame. Вот соответствующий код

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

Любая идея, ребята?

РЕДАКТИРОВАТЬ: Другой минимальный пример:

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

И ошибка «Использование подробностей необъявленного идентификатора

Обратите внимание, что этов нескольких файлах, так что, возможно, это проблема со связью?

Ответы [ 2 ]

1 голос
/ 15 января 2012

Чтобы указать нужное имя напрямую, произнесите либо detail::IChessPieceEnums::PieceId, либо ::ChessGame::detail::IChessPieceEnums::PieceId, но предпочтительно первое.Тем не менее, ваш нынешний синтаксис тоже в порядке, так как поиск возобновляется в глобальном пространстве имен, если имя не может быть найдено.

0 голосов
/ 15 января 2012

ОК нашел решение. Решение состоит в том, чтобы поместить деталь пространства имен в свой собственный файл с именем detail.h. Таким образом, piece.h и board.h должны включать details.h для его использования. Это сработало.

И проблема с оригинальным постом в том, что есть круговая ссылка. Это вызывает проблемы как-то. Хотелось бы объяснение.

...