2013-03-28 54 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允許全範圍界定。