代码之家  ›  专栏  ›  技术社区  ›  Dustin Getz sunsations

标准兼容的方法来typedef我的枚举

  •  3
  • Dustin Getz sunsations  · 技术社区  · 14 年前

    如何在不正确定义枚举范围的情况下消除警告?符合标准的规范将与 foo::bar::mUpload (见 here ,但是显式的作用域确实很长,使DARN无法读取。

    也许还有另一种方法不使用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 回复  |  直到 14 年前
        1
  •  3
  •   David Rodríguez - dribeas    14 年前

    如果枚举是在一个类中定义的,那么您所能做的最好的事情就是将该类带到您自己的范围内,并只使用 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 );
    
        2
  •  1
  •   EFraim    14 年前

    可以将枚举括在命名空间中,然后使用 using 该命名空间上的语句。

    这显然只适用于类范围之外的枚举。

    在你的情况下,我不明白你为什么不把它称为 bar::mUpload (之后) using namespace foo using foo::bar )

        3
  •  0
  •   jon hanson    14 年前

    您可以对foo::bar使用typedef:

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

    或者你在寻找不同的东西?