我需要在我的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方法的签名。
答案 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());
这应该有用。