C2621:非法工会会员。 (c++)

C2621: illegal union member. (c++)

我使用 Visual Studio,我注意到不支持不受限制的联合。我写了一个 vec4 结构,基本上是这样的:

template<class T>
struct vec4
{
    T x, y, z, w;

    vec4() :x(0), y(0), z(0), w(0) {}
    vec4(T x, T y, T z, T w) :x(x), y(y), z(z), w(w) {}
    vec4(const vec4& v) :x(v.x), y(v.y), z(v.z), w(v.w) {}
};

所以重点是我不想单独编写 vec2i(整数)vec2d(双精度)等...。 然后我做了一个4乘4的矩阵:

template<class T>
struct mat4
{
    T elements[16];

    mat4()
    {
        for (int i = 0; i < 4 * 4; i++)
        {
            elements[i] = 0;
        }
    }
};

同样,重点是我不想编写所有单独的类型。我想以 vec4s 的形式访问矩阵列。但如果我这样做:

union
{
    T elements[16];
    vec4<T> columns[4];
};

我得到了 C2621。据我所知,我可以在 GCC 中执行此操作,但我想避免切换我的开发环境。有解决办法吗?

编辑: 我试过这样的技巧:

vec4<T> * column(int col)
{
    return ((vec4<T>*) (((vec4<T>*)elements) + (sizeof(vec4<T>) * col)));
}

然而这似乎给我一个不好的结果。

https://msdn.microsoft.com/en-us/library/bd149yt8.aspx?f=255&MSPPError=-2147217396

Union member has a non-trivial copy constructor

具有非平凡构造函数 (12.1) 的 class 对象,一个非平凡 复制构造函数 (12.8)、非平凡的析构函数 (12.4) 或非平凡的复制赋值运算符 (13.5.3、12.8) 不能是联合的成员,也不能是此类对象的数组。

在 "struct vec4" 中 revmoving copy ctor 怎么样?