为什么我得到这个“枚举”不是类或命名空间错误?

时间:2014-03-06 23:28:52

标签: c++ enums

我需要在我的Manager类中调用带有此签名的方法:

void createPlayer(Player& player, PlayerType& playerType);

我的播放器定义如下:

using namespace std;

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };

class Player {
  public:
    Player();
    void setType(PlayerType);
  private:
    PlayerType type;
};

这就是我尝试在main ...中调用方法的方法。

#include "Player.h"
#include "Manager.h"

int main() {

  Manager manager;
  Player player;
  PlayerType t = PlayerType::FORWARD;
  manager.createPlayer(player, t);

  return 0;
}

...但无法使用此错误进行编译:

Main.cc: In function ‘int main()’:
Main.cc:12:18: error: ‘PlayerType’ is not a class or namespace

有什么想法吗?注意:我无法更改createPlayer方法的签名。

4 个答案:

答案 0 :(得分:10)

enum没有创建命名空间。

因此PlayerType t = PlayerType::FORWARD;应更改为:

PlayerType t = FORWARD;

请注意,c ++ 11引入了enum class es,它们具有命名空间。除此之外,MSVC还有一个扩展,用于处理(常规)枚举,就像它们具有命名空间一样。因此,您的代码实际上应该与MSVC一起使用。

答案 1 :(得分:7)

不幸的是,enum默认情况下不会创建枚举命名空间。所以在声明时:

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };

你必须像这样使用它:

auto x = FORWARD;

幸运的是,C ++ 11引入了enum class or enum struct来解决这个问题:

enum class PlayerType { FORWARD, DEFENSEMAN, GOALIE };

然后您就可以像访问它一样访问它了:

auto x = PlayerType::FORWARD;

答案 2 :(得分:1)

您的错误似乎在这一行: PlayerType t = PlayerType::FORWARD;

据我所知,范围解析运算符(::)在常规C ++ 98枚举中无效,除非您的编译器通过非标准扩展支持它们(如Visual工作室)。因此,您无法使用它来引用枚举器中的特定值。

此外,C ++ 98枚举存在污染定义它们的命名空间的问题,这可能导致名称冲突。幸运的是,C ++ 11解决了这个问题,引入了enum class。有关更多信息,请查看Stroustrup的常见问题解答:http://www.stroustrup.com/C++11FAQ.html#enum

答案 3 :(得分:0)

添加一个静态函数,例如getForward:

class Player {
  public:
    Player();
    void setType(PlayerType);
    static PlayerType getForward {
        return FORWARD;
    }
  private:
    PlayerType type;
};

然后在main中使用它:

manager.createPlayer(player, Player::getForward());

这应该有用。