在C ++ / CLI中更改了如何使用vs2012强制转换和获取枚举的行为

时间:2013-10-18 12:21:12

标签: visual-studio-2012 enums c++-cli visual-studio-2005

由于2010年C ++ / CLI的支持非常糟糕(没有c ++ / cli的向导!),我的一个项目仍然是VS2005 C ++ / CLI。现在是迁移这个最后一个项目的时候了。不幸的是,它在编译期间出现错误。其中两个我不明白,因为他们之前工作得很好,试着在VS2012上编译这个小片段:

        enum class EMyEnum
        {
            Unknown,
            NotBetter,
        };

        Array ^lEnums=Enum::GetValues(EMyEnum::typeid);
        Object ^test=lEnums->GetValue(0);
        EMyEnum t=(EMyEnum)test;  // VS2012 ERROR -> Cannot cast
        String ^thetext=t.ToString(); // VS2012 ERROR -> Left of ToString() needs object

毋庸置疑,在VS2005中,它不仅可以在没有错误或警告的情况下进行编译,而且还可以按预期工作。

1 个答案:

答案 0 :(得分:2)

是的,这是VS2012及以上的问题。这是由采用enum class语法的C ++ 11语言标准引起的。 C ++ / CLI编译器现在不再能够区分托管枚举类型和非托管类型。 Object ^的强制转换仅对托管枚举有效。

解决方法很愚蠢但有效,您应该明确指定枚举类的可访问性。在C ++ 11中不合法但在C ++ / CLI中有效的东西。修正:

    private enum class EMyEnum      // Note: added private
    {
        Unknown,
        NotBetter,
    };

或使用 public