符合标准的方式来键入我的枚举

时间:2010-07-19 21:10:10

标签: c++ enums

如何在没有明确确定枚举范围的情况下摆脱警告?符合标准的代码将与foo::bar::mUpload进行比较(请参阅here),但显式范围非常长并且使得该事物不可读。

也许有另一种方法不使用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 个答案:

答案 0 :(得分:3)

如果枚举是在一个类中定义的,那么你可以做的最好的事情是将类带入你自己的范围,只需使用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 :(得分:1)

您可以将枚举包含在命名空间中,然后在该命名空间中使用using语句。

这显然只适用于enum在课堂范围之外。

在您的情况下,我不明白为什么您不将其称为bar::mUpload(在using namespace foo之后,或using foo::bar

答案 2 :(得分:0)

您可以将typedef用于foo :: bar:

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

或者您正在寻找不同的东西吗?