C++枚举在一个类中 - 声明顺序很重要?

Joc*_*ckX 2 c++ visual-studio-2010

我正在使用visual studio 2010,并且不能完全搞定,这个类怎么错(语法错误:标识符'EnumType')并且不会编译:

class BrokenClassWithEnum
{
private:
    void useEnum (EnumType enumType); //syntax error : identifier 'EnumType '
public:
    enum EnumType 
    {
        VAL1,
        VAL2,
        VAL3
    };
}
Run Code Online (Sandbox Code Playgroud)

这没关系:

class WorkingClassWithEnum
{
public:
    enum EnumType 
    {
        VAL1,
        VAL2,
        VAL3
    };
private:
    void useEnum (EnumType enumType);
}
Run Code Online (Sandbox Code Playgroud)

班级范围发生了什么变化?

A B*_*A B 5

我不认为定义(非声明)的顺序很重要,但前向声明将解决此错误 - 至少在MSVC++ 6中.在MSVC++ 6之外,您应该指定一个存储类型来转发声明一个枚举(指定的要求)前向枚举中的存储类型是在C++ 0x标准中)

注意:VC++ 6将允许省略存储类型,但如果您正在声明枚举,则应声明存储类型(见下文):

这将解决VC++ 6中的错误.但是,VC++ 6似乎不支持C++ 0x标准所要求的类内枚举的存储类型:

class BrokenClassWithEnum {
public:
    enum EnumType;

private:
    void useEnum (EnumType enumType); 
public:
    enum EnumType {
        VAL1,
        VAL2,
        VAL3
    };
};
Run Code Online (Sandbox Code Playgroud)


通常在符合C++ 0x的编译器中使用IE,您可以使用以下内容:

class BrokenClassWithEnum {
public:
    enum EnumType : int;

private:
    void useEnum (EnumType enumType);
public:
    enum EnumType : int {
        VAL1,
        VAL2,
        VAL3
    };
};
Run Code Online (Sandbox Code Playgroud)

注意:在某些但不是所有C++版本中都可以转发枚举声明:

转发在c ++中声明一个枚举