我正在尝试在Visual Studio 2013中编译一些C++代码,但是遇到了错误。这是一个演示问题的简化测试用例:

template <typename SomeEnum>
struct Inner {
    SomeEnum variant;
    int innerVal;
};

template <typename SomeEnum>
struct Outer {
    int outerVal;
    union {
        Inner<SomeEnum> inners[10];
        unsigned char data[20];
    };
};

enum MyEnum {
    VAR1,
    VAR2
};

int main() {
    Outer<MyEnum> outer;
    return 0;
}

这给我错误main.cpp(11): error C2621: 'Outer<MyEnum>::inners' : illegal union member; type 'Inner<SomeEnum>' has a copy constructor。好像Inner<SomeEnum>应该和它们一样是POD。这是一个已知问题,还是由于我不知道的原因导致代码无效?一些谷歌搜索没有取得结果。

如果我不是Inner不是模板类,还是如果inners不是数组,则示例将编译,但是不幸的是,这两个都不是我的实际代码的选项。我还有其他方法可以完成同一件事吗?

最佳答案

它可以在ideone.com上运行,使我认为这可能是VS2013错误。如果可以的话,您可以尝试VS2015。

一个可能的解决方法是显式地专门化要使用的每个枚举。

MyEnum定义之后添加:

template <>
struct Inner<MyEnum> {
    MyEnum variant;
    int innerVal;
}

由于某种原因使错误消失。显然,这将导致大量重复的代码,而这正是模板试图阻止的。您可以编写一个宏(ugh)为您专门化此模板。

09-27 06:57