如何确保在类中声明的枚举是托管枚举



在Visual C++(VS 2015(中,我可以如下定义托管枚举:

public enum class Pet {
Cat,
Dog,
Hamster,
};

"公共"这个关键词至关重要。如果没有它,它将不会将Pet视为托管枚举,并且您将无法使用enum::GetName访问与枚举成员相关联的文本。

但是,如果我尝试在类中声明一个枚举,就像这样:

class Construction {
public :
public enum class Fixing {
Nut,
Bolt,
Rivet,
};
};

我收到这个错误消息:

error C3379: 'Construction::Fixing': a nested class cannot have an assembly access specifier as part of its declaration

如果我从声明中删除"公共",如下所示:

class Construction {
public :
enum class Fixing {
Nut,
Bolt,
Rivet,
};
};

然后添加以下代码:

int main(array<System::String ^> ^args)
{
array<String^> ^names = Enum::GetNames( Construction::Fixing::typeid );
for ( int i = 0; i < names->Length; ++i ) {
Console::WriteLine( names[ i ] );
}
return 0;
}

然后它会毫无怨言地编译,但输出并不是我所期望的。根本没有输出。深入研究,我发现Enum::GetNames正在返回一个零长度的数组。编译器似乎将Fixing视为非托管枚举,并对"enum-class"使用C++11语法。

那么,我该如何更改代码,使Fixing成为托管枚举呢?

我想明白了。我需要确保声明枚举的类是托管类,如下所示:

ref class Construction {
public :
enum class Fixing {
Nut,
Bolt,
Rivet,
};
};

然后,写出成员名称的代码就可以工作了。然而,我仍然认为"枚举类修复"这一行看起来相当模糊。目前还不清楚这是否是一个托管枚举。

最新更新