5

我明白什么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 不应该有编译器提供的简单默认构造函数吗?

4

2 回答 2

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;

这样,将其粘贴在联合中并保留默认构造函数不会有任何问题。

于 2013-05-11T07:48:29.007 回答
2

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

错误:联合中不允许使用构造函数的成员“Vector3 TransformData::data_t::vec3”

以及(现在)更聪明的 g++ 的奖励:

注意:无限制联合仅适用于 -std=c++11 或 -std=gnu++11

于 2013-05-11T07:44:00.637 回答