Visual studio 2012 更改了如何在C+;中使用vs2012强制转换和获取字符串枚举的行为+/CLI
由于2010年对C++/CLI的支持非常糟糕(C++/CLI没有向导!),我的一个项目仍然是VS2005 C++/CLI。现在是迁移最后一个项目的时候了。不幸的是,它在编译时会出现错误。其中两个我不理解,因为它们以前工作得很好,请尝试在VS2012上编译此小片段:Visual studio 2012 更改了如何在C+;中使用vs2012强制转换和获取字符串枚举的行为+/CLI,visual-studio-2012,enums,c++-cli,visual-studio-2005,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=En
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中,它不仅编译时没有错误或警告,而且工作正常。是的,这在VS2012及以上版本中是一个问题。这是由于C++11语言标准采用了
enum类
语法造成的。C++/CLI编译器现在不再能够区分托管枚举类型和非托管枚举类型。来自对象^1的强制转换仅对托管枚举有效
解决方法虽然愚蠢但有效,您应该显式指定枚举类的可访问性。在C++11中不合法但在C++/CLI中有效的内容。修正:
private enum class EMyEnum // Note: added private
{
Unknown,
NotBetter,
};
或者公开使用。你知道你很了不起吗?:-)