Syntax C++/枚举的CLI语法在2010年和2012年之间更改

Syntax C++/枚举的CLI语法在2010年和2012年之间更改,syntax,c++-cli,enumeration,Syntax,C++ Cli,Enumeration,我继承了一个解决方案,它在一个C API DLL和一个C#GUI周围有一个C++/CLI包装器。C++/CLI包装最初是使用VisualStudio 2010创建的,它是使用VisualStudio 2012创建的GUI和解决方案。当时未升级C++/CLI项目。在C++/CLI项目中,有一个枚举定义如下: enum class DataCommands { Read, Write }; String::Format("Data Command {0}", Command.ToStrin

我继承了一个解决方案,它在一个C API DLL和一个C#GUI周围有一个C++/CLI包装器。C++/CLI包装最初是使用VisualStudio 2010创建的,它是使用VisualStudio 2012创建的GUI和解决方案。当时未升级C++/CLI项目。在C++/CLI项目中,有一个枚举定义如下:

enum class DataCommands
{
  Read,
  Write
};
String::Format("Data Command {0}", Command.ToString() );
在后面的代码中,我将记录调用了哪个命令。为此,我创建了如下字符串:

enum class DataCommands
{
  Read,
  Write
};
String::Format("Data Command {0}", Command.ToString() );
在我最近尝试将C++/CLI项目的目标更改为2012年(v110)之前,这一切都很好。然后,当我尝试编译项目时,我得到了错误:

Error   1   error C2228: left of '.ToString' must have class/struct/union   C:\Path\To\File\FileName.cpp    51  1   WrapperProject
我尝试将
替换为
->
,但也不起作用。不知道如何解决这个问题,也不知道为什么会改变。如果你能给我指出正确的资源,我很乐意阅读


提前感谢

是的,这确实是VS2012及以上版本中的一个问题。新的C++11语言规范采用了一些特定于C++/CLI的语法。例如
override
nullptr
enum类
。编译器不再能够区分托管枚举和本机枚举之间的区别,不幸的是,即使/clr有效,编译器也默认为本机风格

解决方法如中所述,添加访问说明符以强制与有效本机语法不匹配:

private enum class DataCommands
{
  Read,
  Write
};
“上下文关键字”
enum类
现在在本机C++11和C++/CLI之间不明确。请尝试使用公共枚举类(或其他访问修饰符)。