2010-07-20 7 views
24

나는 네임 스페이스에 열거 형을 가지고 있으며 다른 네임 스페이스에있는 것처럼 그것을 사용하고 싶습니다. 직관적으로, 나는 이것을 사용하기 위해 'using'또는 'typedef'를 사용할 수 있다고 생각했지만 실제로는 작동하지 않습니다.C++에서 열거 형을 다른 네임 스페이스로 어떻게 가져 옵니까?

namespace foo 
{ 

enum bar { 
    A 
}; 

} 

namespace buzz 
{ 
// Which of these two methods I use doesn't matter, 
// the results are the same. 
using foo::bar; 
//typedef foo::bar bar; 
} 

int main() 
{ 
    foo::bar f; // works 
    foo::bar g = foo::A; // works 

    buzz::bar x; // works 
    //buzz::bar y = buzz::A; // doesn't work 
    buzz::bar z = foo::A; 
} 

문제는 열거 자체가 가져 오는 것입니다하지만 요소 : 없음 코드는 GCC와 일 CC에서 테스트, 그것을 증명합니다. 불행히도, 기존의 enum이 다른 기존 코드를 많이 손상시키지 않으면 서 추가 더미 네임 스페이스 또는 클래스에 포함되도록 변경할 수는 없습니다. 내가 생각할 수있는 가장 좋은 방법은 수동으로 열거 재현하는 것입니다

namespace buzz 
{ 
enum bar 
{ 
    A = foo::A 
}; 
} 

을하지만 그것은 DRY principle을 위반하는 것입니다. 더 좋은 방법이 있습니까?

+0

"하지만 DRY 원칙을 위반합니다." 이 경우 원칙을 다시 생각해 보겠습니다. "더 좋은 방법 있니?" enum (불행하게도)은 범위가 아니지만 enum 요소를 추가 struct 또는 네임 스페이스에 넣을 수 있습니다. – SigTerm

+0

불행히도 다른 코드는 다른 열거 형에 있지 않은 원래 열거 형에 의존합니다./ –

+1

와우 ... 누군가 그와 비슷한 것을 묻지 않았다면, 나는 그것이 작동 했어야한다고 대답했을 것입니다. C++의이 어두운 구절을 드러내 주셔서 감사합니다 ... +1. – paercebal

답변

22

원래 네임 스페이스에서 "사용"한 중첩 네임 스페이스에 기존 네임 스페이스를 줄 바꿈하십시오.

namespace foo 
{ 
    namespace bar_wrapper { 
     enum bar { 
      A 
     }; 
    } 
    using namespace bar_wrapper; 
} 

namespace buzz 
{ 
    using namespace foo::bar_wrapper; 
} 
5

여기서 사용하는 선언은 열거 형의 이름 만 가져오고 값의 이름은 가져 오지 않습니다. 열거 형은 범위가 아니며 열거 자의 이름을 따르지 않습니다. 열거 형 값 자체를 가져 오는 것이 가능하지 않다고 생각합니다. 구조체/네임 스페이스에서 enum을 래핑하여 사용하십시오.

+3

사이드 댓글 : C++에서 enum은 열거 된 값에 액세스 할 수있는 * 종류의 * 컨텍스트입니다. 'enum A {a, b}; A :: a'는 유효한 코드가 될 것이고 일단 그것이 사용되면 간단한 "using"또는 "typedef"접근법이 작동 할 것입니다 : namespace A {enum X {a, b}; } 네임 스페이스 B {A :: X 사용; } int main() {B :: X x = B :: X :: a; }' –

1

using foo::bar; 대신 using namespace foo;을 사용해보십시오. 그러나 클래스 또는 다른 네임 스페이스에서 열거 형을 캡슐화하는 것이 훨씬 더 좋은 방법입니다.

8

내가는 기존의 암호를 해독하지 않기 때문에, 당신은 또한 다음을 수행 할 수 있습니다, 마크 B 최선의 방법을 좋아하는 동안 :

 
namespace foo { 
enum bar { 
    A, B [..] 
}; 
} 

namespace buzz { 
using foo::bar; 
using foo::A; 
using foo::B; 
[..] 
} 
1

에서 시작을 C++ (11)는 enum class을 사용할 수 있습니다 . enum class은 모든 값을 가져 오기 :

namespace foo 
{ 

enum class bar { 
    A 
}; 

} 

namespace buzz 
{ 
using foo::bar; 
} 

int main() 
{ 
    foo::bar f; 
    foo::bar g = foo::bar::A; 

    buzz::bar x; 
    buzz::bar y = buzz::bar::A; 
    buzz::bar z = foo::bar::A; 
} 

위의 코드는 성공적으로 컴파일 : http://coliru.stacked-crooked.com/a/2119348acb75d270.

관련 문제