由于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中,它不仅可以在没有错误或警告的情况下进行编译,而且还可以按预期工作。
答案 0 :(得分:2)
是的,这是VS2012及以上的问题。这是由采用enum class
语法的C ++ 11语言标准引起的。 C ++ / CLI编译器现在不再能够区分托管枚举类型和非托管类型。 Object ^的强制转换仅对托管枚举有效。
解决方法很愚蠢但有效,您应该明确指定枚举类的可访问性。在C ++ 11中不合法但在C ++ / CLI中有效的东西。修正:
private enum class EMyEnum // Note: added private
{
Unknown,
NotBetter,
};
或使用 public 。