如何同时拥有C ++ / CLI和非托管C ++ 11枚举类,我需要做什么?

时间:2013-11-25 14:16:54

标签: c++11 enums c++-cli

C ++ 11中新的枚举类类型来自C ++ / CLI版本,它们具有相同的名称,但它们完全不同并且导致我出现问题。

我有一个用C ++ 11编写的库,其中包含几个结构,如(这里简化):

// File.h

enum class MyEnum : unsigned int
{
   Val1,
   Val2
};

struct MyStruct
{
    MyEnum value;
    MyStruct(MyEnum v) : value(v) {}
};

我试图从C ++ / CLI类库中获取此代码以将其公开给.NET。我包括这样的文件:

#pragma unmanaged
#include "File.h"
#pragma managed

问题是enum构造函数会产生一个编译错误消息,如:

error C3821: 'v': managed type or function cannot be used in an unmanaged function

建议编译器仍将enum类解释为C ++ / CLI枚举类,即使我在非托管部分内,它确实应该将其解释为C ++ 11枚举类。我能做些什么吗?

编辑:我正在使用VS2012。如果VS2013解决了这个问题,请告诉我。

1 个答案:

答案 0 :(得分:2)

我在VS2013中遇到同样的问题。在我的情况下,我包括一个非托管enum class,但编译器正在生成错误,因为它认为它是一个托管enum class。在对问题的评论的帮助下,我能够通过删除枚举的所有前向声明来解决它。看起来这是一个编译器错误,前向声明忽略了#pragma unmanaged指令。

我已经创建了一个如何在这里重现错误的示例:

#pragma managed(push, off)

enum class TestEnum
{
    One,
    Two,
    Three,
};

#include <vector>

enum class TestEnum; // Forward declaration after actual declaration causes the bug

#pragma managed(pop)

int main(array<System::String ^> ^args)
{
    // error C3699: '&&' : cannot use this indirection on type 'TestEnum'
    std::vector<TestEnum> enums;

    return 0;
}

我在这里向微软报告了这个问题:
https://connect.microsoft.com/VisualStudio/feedback/details/1218131