繁体   English   中英

当union包含VS2013中的模板类数组时,错误C2621

[英]Error C2621 when union contains array of template class in VS2013

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

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 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;
}

由于某种原因使错误消失。 显然,这将导致大量重复的代码,这是模板试图阻止的。 你可能会写一个宏(呃)来为你做这个模板专业化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM