0

由于 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 中它不仅编译时没有错误或警告,而且还可以按预期工作。

4

1 回答 1

2

是的,这是 VS2012 及更高版本中的问题。这是由于 C++11 语言标准采用了该enum class语法造成的。C++/CLI 编译器现在不能再区分托管枚举类型和非托管枚举类型。Object^ 的强制转换仅对托管枚举有效。

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

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

或使用public

于 2013-10-18T13:06:08.027 回答