2010-07-19 3 views
3

Как я могу избавиться от предупреждения, явно не указав enum правильно? Соответствующий стандартам код должен был бы сравниваться с foo::bar::mUpload (см. here), но явные области действительно длинны и делают черную вещь нечитаемой.Соответствует стандарту для 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

Если перечисление определено в классе, лучшее, что вы можете сделать, это привести класс в свою область действия и просто использовать class_name::value или определить typedef класса. В C++ 03 значения enum являются частью охватывающей области (которая в вашем случае является классом). В 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 заявление на этом пространстве имен.

Это явно работает только для перечисления вне класса.

В вашем случае я не вижу, почему бы вам не обратиться к нему как bar::mUpload (после using namespace foo или using foo::bar)

+0

, что если я не хочу изменять перечисление? я не писал его и его использовали в другом месте. –

+0

Единственный способ избавиться от этого предупреждения в этом случае - это указать значения 'foo :: bar :: mUpload' и т. Д. Вы можете сделать свой typedef' typedef foo :: bar mode_t', но, конечно, вы могли бы используйте 'mode_t' везде, где ожидается' foo :: bar' ... –

0

Вы можете использовать ЬурейеЕ для Foo :: бар:

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

Или вы ищете что-то другое?

Смежные вопросы