【问题标题】:Why am I getting this 'enum' is not a class or a namespace error?为什么我得到这个“枚举”不是类或命名空间错误?
【发布时间】:2014-04-09 21:50:02
【问题描述】:

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

【问题讨论】:

标签: c++ enums


【解决方案1】:

enum 不创建命名空间。

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

PlayerType t = FORWARD;

请注意,c++11 引入了enum classes,它有一个命名空间。除了这个 MSVC 有一个扩展,它将(常规)枚举视为具有命名空间。因此,您的代码实际上应该适用于 MSVC。

【讨论】:

    【解决方案2】:

    不幸的是,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;
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        添加一个静态函数比如getForward:

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

        然后在main中使用:

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

        这应该可行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-08
          • 2016-03-27
          • 2014-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          相关资源
          最近更新 更多