全公共结构生成调用隐式删除的默认构造函数

时间:2013-05-11 07:25:36

标签: c++

我理解call to implicitly-deleted default constructor的意思,但我不明白为什么我会在这里找到它:

        struct TransformData{
        enum type_t{
            kDelay=0,
            kScale,
            kTranslate,
            kRotation
        }type;

        union data_t{
            double delaySeconds;
            float scale;
            float rotation;
            vec3 translate;
        }data;
    };

然后我有:

TransformData data; //generates error noted in title

POD不应该有编译器提供的简单默认构造函数吗?

2 个答案:

答案 0 :(得分:6)

如前所述,Vector3<T>是非POD类型。根据您问题中的信息,如果您使用的是C ++ 11,则可以将其设为POD类型:

template <typename T>
struct Vector3 {
  Vector3() = default; // <--- instead of { }
};

typedef Vector3<float> vec3;

struct TransformData {
  union data_t {
    double delaySeconds;
    float scale;
    float rotation;
    vec3 translate;
  } data;
};

TransformData data;

这样,你就不会有任何问题将它粘在一个联合中并保留默认的构造函数。

答案 1 :(得分:2)

代码在没有vec3 translate;的情况下编译正常 正如您在评论中提到的,translate的类型是class Vector3,这是非POD。 union内不允许使用非POD数据变量 g ++的编译器错误说明了一切:

  

错误:成员'Vector3 TransformData :: data_t :: vec3'和构造函数   不允许加入联盟

来自(现在)聪明的g ++的好处:

  

注意:不受限制的联合仅适用于-std = c ++ 11或   -std = GNU ++ 11