2014-04-25 13 views
21

ben orada farklı çeteleler var ama her enum içinde aynı eleman isimleri örneğin vardır benim tüm dosyaları dahil yapılandırma dosyası vardır: config.hC++ eritmeden farklı enum adlarında aynı enum üyelerine nasıl sahip olacak: redefinition; önceki tanım oldu 'listeleyicisi'

enum GameObjectType 
{ 
    NINJA_PLAYER 

}; 
enum GameObjectTypeLocation 
{ 
    NONE, 
    MASSAGE_ALL, //this is for ComponentMadiator 
    NINJA_PLAYER 


}; 

Ama

error C2365: 'NINJA_PLAYER' : redefinition; previous definition was 'enumerator' (..\Classes\GameFactory.cpp) 
2>   d:\dev\cpp\2d\cocos2d-x-3.0\cocos2d-x-3.0\projects\lettersfun\classes\config.h(22) : see declaration of 'NINJA_PLAYER' 
: Ben

m_pNinjaPlayer = (NinjaPlayer*)GameFactory::Instance().getGameObj(GameObjectType::NINJA_PLAYER); 
    ComponentMadiator::Instance().Register(GameObjectTypeLocation::NINJA_PLAYER,m_pNinjaPlayer); 

alıyorum derleme hatası düzgün enum adıyla çeteleler çağırarak birlikte projeyi derlemek için deneyin

Farklı adlara sahip birkaç enum'u aynı eleman adlarıyla BUT'ta nasıl saklayabilirim?

cevap

27

Sorun, eski stil numaralarının bozulmamış olmasıdır. İsim alanları içinde eski okul numaralandırma koyabilirsiniz, Alternatif

enum class GameObjectType { NINJA_PLAYER }; 

enum class GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER }; 

:

namespace foo 
{ 
    enum GameObjectType { NINJA_PLAYER }; 
} // namespace foo 

namespace bar 
{ 
    enum GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER }; 
} // namespace bar 

Sen kapsamına sahip enumerations kullanarak bu sorunu (sizin derleyici alakalı C++ 11 desteğine sahiptir şartıyla) önleyebilirsiniz Sonra enum değerleri foo::NINJA_PLAYER, bar::NINJA_PLAYER vb

+0

Teşekkür bilmiyordum. Bu bir C++ şey. – user63898

+0

sınıfı kullanabilirsiniz c –

+0

çalışmak görünmüyor çeteleler – juanchopanza

5

Kullanmak imkanı varsa C++ 11 Ben çarpışmaları önlemek için enum sınıfı özelliğini kullanmayı öneriyoruz:

enum class GameObjectType 
{ 
    NINJA_PLAYER 

}; 
enum class GameObjectTypeLocation 
{ 
    NONE, 
    MASSAGE_ALL, //this is for ComponentMadiator 
    NINJA_PLAYER 


}; 

Düzenleme: Eğer bu yeteneği yoksa, o zaman kullanmanız gerekecektir Her bir enum için iki farklı ad alanı.

+1

İki farklı ad olabilir veya bir sınıf ile her enum kaydırılır. Bu işletim sistemi bağımlı değildir diego.martinez @ ++ 11 ... linux içinde –