0

2010 年には C++/CLI のサポートが非常に悪かったので (c++/cli のウィザードはありません!)、私のプロジェクトの 1 つはまだ VS2005 C++/CLI です。今こそ、この最後のプロジェクトを移行するときです。残念ながら、コンパイル時にエラーが発生します。そのうちの 2 つは、以前は完全に機能していたため、理解できません。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 以降の問題です。enum classこれは、構文を採用する C++11 言語標準が原因です。C++/CLI コンパイラは、管理された列挙型と管理されていない列挙型を区別できなくなりました。Object^ からのキャストは、マネージ列挙に対してのみ有効です。

回避策はばかげていますが効果的です。enum クラスのアクセシビリティを明示的に指定する必要があります。C++11 では合法ではありませんが、C++/CLI では有効です。修理:

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

またはpublicを使用します。

于 2013-10-18T13:06:08.027 に答える