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解决了这个问题,请告诉我。答案 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