совместимый со стандартами способ определения моих перечислений - PullRequest
3 голосов
/ 20 июля 2010

Как я могу избавиться от предупреждения, без явного определения области действия enum?Соответствующий стандартам код должен сравниваться с foo::bar::mUpload (см. здесь ), но явные области видимости очень длинные и делают эту чертову вещь нечитаемой.

возможно, есть другой способ, который нене используете 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 ]

3 голосов
/ 20 июля 2010

Если перечисление определено внутри класса, лучшее, что вы можете сделать, это перенести класс в вашу собственную область и просто использовать class_name::value или определить typedef класса. В C ++ 03 значения перечисления являются частью охватывающей области (которая в вашем случае является классом). В C ++ 0x / 11 вы сможете квалифицировать значения с именем enum:

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 голос
/ 20 июля 2010

Вы можете заключить свой enum в пространство имен, а затем использовать оператор using в этом пространстве имен.

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

В вашем случае я не понимаю, почему вы не называете это bar::mUpload (после using namespace foo или using foo::bar)

0 голосов
/ 20 июля 2010

Вы можете использовать typedef для foo :: bar:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...