我理解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不应该有编译器提供的简单默认构造函数吗?
答案 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