본문 바로가기

Coding Note

duplicated element name of different enums

c++ 에서 enum은 어플리케이션 성격에 따라서 굉장히 자주 쓰이기도 하는 타입이다.

 

문제가 되는게 enum의 스코프 때문인데.. 아래 코드를 보자.

 

enum EnumA{

Elem1, Elem2

};

 

EnumA는 전역 스코프에서 정의되었다. 이 경우 Elem1은 EnumA::Elem1와 같이 접근할 수 있지만, 컴파일러는 이의 정의를 ::Elem1, 즉 전역 스코프 상에 존재하는것으로 판단한다. 접근하는 측에선 이래 접근하나 저래 접근하나 결과는 같으니 무리없다.

 

그런데 이러한 스코프 판단이 다음의 상황에서는 문제가된다.

 

enum EnumA{

Elem1, Elem2

};

 

enum EnumB{

Elem1, Elem3

};

 

위 코드의 의도는 EnumA의 Elem1과 EnumB의 Elem1은 서로 다른 엘리먼트임을 주장하지만, 실상은 같은 전역 스코프에 존재하는 값이 되어버린다. 당연히 중복을 피해서 열거타입을 정의하면 해결되겠지만, 코드의 가독성 측면에서 같은 이름의 엘리먼트를 다른 열거타입에 두고싶을 때가 있다.

이러한 문제는 열거타입을 다른 스코프상에 존재하게 하는 방식으로 해결할 수 있다.

 

struct _EnumA_wrapper{

enum EnumA{

Elem1, Elem2

};

};

typedef enum _EnumA_wrapper::EnumA EnumA;

 

struct _EnumB_wrapper{

enum EnumB{

Elem1, Elem3

};

};

typedef enum _EnumB_wrapper::EnumB EnumB;

 

혹은 네임스페이스로 스코프를 나눠주는 것도 괜찮다. 이 편이 보기에 조금 깔끔하지만, 개인적으로 자주쓰는 방식은 아니다.

 

namespace _EnumA_ns{

enum EnumA{

Elem1, Elem2

};

}

using _EnumA_na::EnumA;

 

namespace _EnumB_ns{

enum EnumB{

Elem1, Elem3

};

}

using _EnumB_ns::EnumB;

 

'Coding Note' 카테고리의 다른 글

UE4, problem of the hierarchical scale transformation  (0) 2015.05.16
setting polymorphic member variable.  (0) 2014.06.15
anonymus union  (0) 2014.03.07
c++ CRTP(curiously recurring template pattern)  (0) 2014.03.02
pymongo json  (0) 2014.02.10