具有构造函数的类的匿名联合/结构

qdi*_*dii 6 c++ gcc unions c++11

GCC抱怨这个代码,即使我使用-std=c++11flag 编译,我的gcc版本据称支持Unrestricted union(> 4.6).

union 
{
    struct 
    {
        float4 I,J,K,T;
    };
    struct 
    {
        float4 m_lines[4];
    };
    struct
    {
        float m16f[16];
    };
    struct 
    {
        float m44f[4][4];
    };
};
Run Code Online (Sandbox Code Playgroud)

请注意,float4有一个非默认构造函数,它接受0个参数.

class float4 
{   
    public:
       float4();
 ....
};
Run Code Online (Sandbox Code Playgroud)

知道我能做什么吗?错误是:

<anonymous union>::<anonymous struct>::I’ with constructor not allowed in anonymous aggregate
Run Code Online (Sandbox Code Playgroud)

Cha*_*via 0

这里的问题不是你的类float4有一个构造函数,使其成为旧 C++03 POD 定义下的非 POD。相反,问题在于您的联合和联合内的结构是匿名的。如果你简单地命名它们,它就会起作用:

union u
{
    struct s1
    {
        float4 I,J,K,T;
    };
    struct s2
    {
        float4 m_lines[4];
    };
    struct s3
    {
        float m16f[16];
    };
    struct s4
    {
        float m44f[4][4];
    };
};
Run Code Online (Sandbox Code Playgroud)

  • “它会起作用”。期望的目标是什么?您创建了一个空联合。我怀疑这是否是所希望的。 (4认同)
  • 感谢您的解决方案,但我想保留我的匿名结构:这个联合嵌套在一个类中,如果我更改名称,我将不得不重命名每个调用。这段代码在 MSVC10 上运行良好,我希望我也可以调整 gcc 以正确处理它。 (2认同)
  • 对于任何阅读的人来说,这个新联合没有数据成员,只有 4 个未使用的内部类型定义。要恢复功能,请使用这些内部类型声明成员,包括在右大括号和分号之间。但是`float4`有一个不平凡的默认构造函数,它为`s1`和`s2`提供了一个,它为`u`提供了一个`delete`d默认构造函数(如果创建了任一结构的非静态成员)。 (2认同)