2013-03-28 56 views
1

获取follwoing错误,同时设置静态无功设置静态枚举正确方法瓦尔在CPP文件

error: expected primary-expression before '.' token 

“GameScene.h”

#ifndef __GAME_SCENE_H__ 
#define __GAME_SCENE_H__ 

class Game { 
public: 

    enum InteractionMode { 
     EDITING, 
     PLAYING }; 
    static Game::InteractionMode mode; 
} 
#endif // __GAME_SCENE_H__ 

“GameScene.cpp”

#include "GameScene.h" 

Game *Game::singleton() { 
    if (_GameSingleton == NULL) { 
     _GameSingleton = Game::create(); 
     Game::mode = Game::InteractionMode.PLAYING; //error on this line 
    } 
    return _GameSingleton; 
} 
+0

偏离主题,但不应使用保留的名称,如'__GAME_SCENE_H__'或'_GameSingleton'。 – 2013-03-28 11:37:04

+0

是的,这就对了。我只是用它们在SO上张贴。不在我的实际代码中。 – asloob 2013-03-28 11:40:09

回答

3

而不是

Game::mode = Game::InteractionMode.PLAYING 

直接写

Game::mode = PLAYING 

而且,如modestatic,必须定义它的类外,增加:

Game::InteractionMode Game::mode; 
2

枚举常数是在周边的范围对象,所以你可以做,例如:

Game::mode = Game::PLAYING; 

或者,由于该功能是在Game类别的已范围:

mode = PLAYING; 

或者,如果你真的想使用完整的作用域,使用范围,运营商::为枚举,以及:

Game::mode = Game::InteractionMode::PLAYING; 
+0

请注意,使用pre-C++ 11时,完整范围设置不符合标准。 MSVC支持它。 – ahans 2013-03-28 11:36:01

+0

'Game :: InteractionMode :: PLAYING'只有当它是一个范围枚举('enum class')时才可能。未示范的枚举值(如问题中的值)始终在周围范围内。 – 2013-03-28 11:36:21

+1

另外,在一个成员函数中,'mode = PLAYING'就足够了,除非你喜欢用不必要的噪音装饰你的代码。 – 2013-03-28 11:38:46

0

枚举的项目在封闭类型中定义,在您的案例class Game。枚举的名称不成为该项目的一部分。您的错误可以通过使用Game::PLAYING来解决。

在C++ 11中也可以包含枚举的名字,所以你可以说Game::InteractionMode::PLAYING。使用MSVC也可以使用早期的C++版本,但是您会收到有关非标准扩展的警告。无论如何,您必须使用::而不是.

如果使用的是C++ 11兼容的编译器,你可以做到以下几点:

enum class InteractionMode { 
     EDITING, 
     PLAYING }; 
// [...] 
mode = Game::InteractionMode::PLAYING; 

包括class允许全范围界定。