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

Rob*_*ume 5 c++ enums

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

void createPlayer(Player& player, PlayerType& playerType);
Run Code Online (Sandbox Code Playgroud)

我的播放器定义如下:

using namespace std;

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };

class Player {
  public:
    Player();
    void setType(PlayerType);
  private:
    PlayerType type;
};
Run Code Online (Sandbox Code Playgroud)

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

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

int main() {

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?注意:我无法更改createPlayer方法的签名.

Seb*_*ann 11

enum 没有创建命名空间.

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

PlayerType t = FORWARD;
Run Code Online (Sandbox Code Playgroud)

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


Sho*_*hoe 7

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

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };
Run Code Online (Sandbox Code Playgroud)

你必须像这样使用它:

auto x = FORWARD;
Run Code Online (Sandbox Code Playgroud)

值得庆幸的是,C++ 11引入enum classenum struct解决了这个问题:

enum class PlayerType { FORWARD, DEFENSEMAN, GOALIE };
Run Code Online (Sandbox Code Playgroud)

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

auto x = PlayerType::FORWARD;
Run Code Online (Sandbox Code Playgroud)