【问题标题】:How can I ensure an enum declared inside a class is a managed enum?如何确保在类中声明的枚举是托管枚举?
【发布时间】:2020-05-06 08:59:17
【问题描述】:

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

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

关键字“public”非常重要。如果没有它,它将不会将 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

如果我从声明中删除“public”,如下所示:

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 视为非托管枚举,并为“枚举类”使用 C++ 11 语法。

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

【问题讨论】:

    标签: visual-c++ enums


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-26
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2014-08-22
      相关资源
      最近更新 更多