我尝试在 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) 来为您专门化此模板。
关于c++ - 在 VS2013 中 union 包含模板类数组时出现错误 C2621,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31665999/