c++ - 在 VS2013 中 union 包含模板类数组时出现错误 C2621

标签 c++ visual-studio visual-c++

我尝试在 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/

相关文章:

c++ - 单个继承的派生类的大小

c++ - 是否存在需要在内存中创建对象到某个地址的情况?

c++ - 为什么 sleep_for 调用 FreeLibrary?

c++ - 使用成员函数创建 std::function 不编译

.net - 显示我的 nuget 的源代码

c++ - 是否有任何类似数组的数据结构可以在两侧增长?

visual-studio - 我可以将 Visual Studio 2008 Express 与 VS 2005 一起安装吗?

c++ - std::put_time() 的问题

c++ - friend &&模板

c++ - 如何使用 QDirIterator 遍历特定类型的文件