如何使用强类型枚举

我无法编译以下程序:

#include <iostream>

using namespace std;

enum class my_enum
{
    ANT,
    BAT,
    CAT,
    DOG,
    EGG,
    FAN,
    MAX_MEMBERS
};

int main(int argc, char * argv[])
{
    my_enum i = my_enum::ANT;

    for(i = my_enum::ANT; i < my_enum::MAX_MEMBERS; i++)
    {
        cout << "Enum value = " << i << endl;
    }

    return 0;
}

我看到构建错误如下:

错误:没有为后缀'++'声明'operator ++(int)'[-fpermissive] for(i = my_enum :: ANT; i <my_enum :: MAX_MEMBERS; i ++)


尽管默认情况下,增量操作符没有为枚举类型定义,但您可以定义自己的,例如:

my_enum& operator++(my_enum& i)
{
    assert(i < my_enum::MAX_MEMBERS);
    i = static_cast<my_enum>(static_cast<int>(i)+1);
    return i;
}

然后,你可以在你的循环中写入++我会很高兴地编译。


你假设你可以使用my_enum作为int,但它现在是一个新类型。 所以需要定义“++”运算符和“<<”运算符以使此类型起作用。

解决这个问题的简单方法是:

#include <iostream>

using namespace std;

enum class my_enum
{
    ANT,
    BAT,
    CAT,
    DOG,
    EGG,
    FAN,
    MAX_MEMBERS
};

int main( int argc, char * argv[] )
{
    for ( my_enum i = my_enum::ANT; i < my_enum::MAX_MEMBERS;  )
    {
        cout << "Enum value = " << (int)i << endl;
        i = my_enum( (int)i + 1 );
    }

    return 0;
}

但是,通常要遍历枚举,典型的代码是:

#include <iostream>

using namespace std;

enum my_enum
{
    ANT,
    BAT,
    CAT,
    DOG,
    EGG,
    FAN,
    MAX_MEMBERS
};

int main( int argc, char * argv[] )
{
    for ( int i = my_enum::ANT; i < my_enum::MAX_MEMBERS; i++ )
    {
        cout << "Enum value = " << i << endl;
    }

    return 0;
}
链接地址: http://www.djcxy.com/p/73067.html

上一篇: How to use strongly typed enums

下一篇: How does the operator overload resolution work within namespaces?