2010-07-19 5 views
3

열거 형을 명시 적으로 지정하지 않고 경고를 없애려면 어떻게해야합니까? 표준을 준수하는 코드는 foo::bar::mUpload (here 참조)과 비교하지만 명시적인 범위는 실제로 길어서 읽을 수 없습니다.표준 준수 방법 내 enum을 typedef

아마도 typedef를 사용하지 않는 또 다른 방법이 있을까요? 열거 형을 수정하고 싶지는 않습니다. 다른 곳에서는 사용하지 않았습니다.

warning C4482: nonstandard extension used: enum 'foo::bar::baz' used in qualified name

namespace foo { 
class bar { 
enum baz {mUpload = 0, mDownload}; 
} 
} 

typedef foo::bar::baz mode_t; 
mode_t mode = getMode(); 

if (mode == mode_t::mUpload) //C4482 
{ 
return uploadthingy(); 
} 
else 
{ 
assert(mode == mode_t::mDownload); //C4482 
return downloadthingy(); 
} 

답변

3

enum이 클래스 내에 정의 된 경우 클래스를 자신의 범위로 가져와 class_name::value을 사용하거나 클래스의 typedef를 정의하면됩니다. C++ 03에서는 열거 형의 값이 엔클 로징 범위 (여러분의 경우에는 클래스)의 일부입니다. C++에서 0X/11이 열거 이름으로 값을받을 수있을 것입니다 : 앞으로

namespace first { namespace second { 
    struct enclosing { 
     enum the_enum { one_value, another }; 
  } 
}} 
using first::second::enclosing; 
typedef first::second::enclosing the_enclosing; 

assert(enclosing::one_value != the_enclosing::another); 

, 당신의 사용은 올바른 (C++ 11)입니다 :

typedef first::second::enclosing::the_enum my_enum; 
assert(my_enum::one_value != my_enum::another); 
1

당신은 네임 스페이스로 열거를 동봉 한 다음 해당 네임 스페이스에 using 문을 사용할 수 있습니다.

이것은 분명히 enum이 클래스 범위 밖에있는 경우에만 작동합니다. 귀하의 경우에는

내가

+0

무엇 열거 형을 수정하고 싶지 않으면? 나는 그것을 사용하지 않고 다른 곳에서 사용하고있다. –

+0

그런 경우에 경고를 없애는 유일한 방법은'foo :: bar :: mUpload' 등의 이름을 지정하는 것입니다. typedef'typedef foo :: bar mode_t'를 만들 수 있습니다. 'foo :: bar'가 예상되는 곳 어디에서나'mode_t'를 사용하십시오 ... –

0

당신은 foo는 : : 막대에 대한 형식 정의를 사용할 수 있습니다 당신이 bar::mUpload로 참조하지 않는 이유를 참조 (using namespace foo 후, 또는 using foo::bar)하지 않습니다

typedef foo::bar fb; 
//... 
fb::baz m = fb::mUpload; 

아니면 다른 것을 찾고 있습니까?

관련 문제