Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我会得到这个';枚举';不是类或命名空间错误吗?_C++_Enums - Fatal编程技术网

C++ 为什么我会得到这个';枚举';不是类或命名空间错误吗?

C++ 为什么我会得到这个';枚举';不是类或命名空间错误吗?,c++,enums,C++,Enums,我需要在我的Manager类中调用具有此签名的方法: void createPlayer(Player& player, PlayerType& playerType); 我有一个这样定义的玩家: using namespace std; enum PlayerType { FORWARD, DEFENSEMAN, GOALIE }; class Player { public: Player(); void setType(PlayerType);

我需要在我的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方法的签名。

enum
不会创建名称空间

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

PlayerType t = FORWARD;


注意,c++11引入了
enum类
es,它有一个名称空间。除此之外,MSVC还有一个扩展,它将(常规)枚举视为具有名称空间。因此,您的代码实际上应该与MSVC一起工作。

不幸的是,
enum
默认情况下不会创建enum名称空间。因此,当宣布:

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };
您必须像这样使用它:

auto x = FORWARD;
幸运的是,C++11的引入解决了这个问题:

enum class PlayerType { FORWARD, DEFENSEMAN, GOALIE };
然后,您可以像以前一样访问它:

auto x = PlayerType::FORWARD;

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

据我所知,作用域解析运算符(
)在常规C++98枚举上无效,除非编译器通过非标准扩展(如Visual Studio)支持它们。因此,不能使用它引用枚举器中的特定值


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

添加静态函数,如getForward:

class Player {
  public:
    Player();
    void setType(PlayerType);
    static PlayerType getForward {
        return FORWARD;
    }
  private:
    PlayerType type;
};
然后在主菜单中使用它:

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

这应该是可行的。

头文件中使用命名空间std
的do not
的可能重复。这是坏习惯。