我正在尝试在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)为您专门化此模板。