为什么会出现“enum不是类或命名空间”错误?

7

我需要在我的Manager类中调用一个带有以下签名的方法:

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

我有一个Player定义如下:

using namespace std;

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };

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

这是我在主方法中调用该方法的方式...
#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方法的签名。


可能是如何在C++中使用枚举的重复问题。 - Mooing Duck
不要在头文件中使用 using namespace std。这是一个不好的习惯。 - Yakk - Adam Nevraumont
4个回答

11

enum 不会创建命名空间。

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

PlayerType t = FORWARD;

请注意C++11引入了具有命名空间的enum class。此外,MSVC有一个扩展,将(常规)枚举视为具有命名空间。因此,您的代码实际上应该可以在MSVC上运行。

7

不幸的是,默认情况下enum不会创建一个枚举命名空间。因此,当声明时:

enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };

你需要像这样使用它:

auto x = FORWARD;

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

enum class PlayerType { FORWARD, DEFENSEMAN, GOALIE };

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

auto x = PlayerType::FORWARD;

1

你的错误似乎在这一行:

PlayerType t = PlayerType::FORWARD;

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

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


0

添加一个静态函数,名为getForward:

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

然后在主函数中使用它:
manager.createPlayer(player, Player::getForward());

这应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接