简体   繁体   中英

Error C2621 when union contains array of template class in VS2013

I have some C++ code I'm trying to compile in Visual Studio 2013, but I'm running into an error. Here's a simplified testcase that demonstrates the problem:

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

This gives me the error 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 . It seems like Inner<SomeEnum> should be as POD as they come. Is this a known problem, or is the code invalid for a reason of which I'm not aware? Some Googling yielded no results on the issue.

The example compiles if I either Inner not a template class or if inners is not an array, but unfortunately neither of those is an option for my actual code. Are there any other ways I could accomplish the same thing?

It works on ideone.com, leading me to think it may be a VS2013 bug. You could try VS2015 if you can.

A possible workaround is to explicitly specialize for each enum you want to use.

Adding this after the MyEnum definition:

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

Makes the error go away for some reason. Obviously that will lead to a ton of duplicated code, which is what templates are trying to stop. You could possibly write a macro (ugh) to make this template specialization for you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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