【发布时间】:2018-11-07 16:54:03
【问题描述】:
我似乎无法创建一个成员是或包含 glm::vec3 对象(用于表示坐标的对象,在本例中包含 3 个浮点数)的联合。 (source code for glm::vec)
在以下代码中使用:
struct Event {
enum Type{
tRaw,
tAction,
tCursor,
} type;
union {
SDL_Event raw;
struct {
uint16 actionID;
bool released;
} action;
struct {
glm::vec3 prevPos;
glm::vec3 pos;
} cursor; // offending object, compiles if this is removed
} data;
};
Visual Studio 给我以下智能感知错误。
"Error: the default constructor of "union Event::<unnamed>" cannot be referenced -- it is a deleted function"
如果删除,联合编译没有任何问题。什么可能导致这个问题,我可以做些什么来解决它?
【问题讨论】:
-
请显示产生此错误消息的代码。
-
@BDL - 添加它
-
@Ext3h:错误。从 C++11 开始就有可能,但您必须明确编写一个构造函数来执行相关放置
new。 -
@AnneQuinn:这有点复杂。如果您有一个具有构造函数的非平凡类,则 C++ 语言不允许在不调用构造函数的情况下创建实例。 C++11 允许联合中的非平凡类型,但它不能生成默认构造函数 & co。在包含
union中,因为必须调用哪个成员的构造函数是不明确的,所以你必须自己编写构造函数,显式调用(使用放置new语法)你想要的一个成员的构造函数激活。 -
@AnneQuinn: 呃...如果你的
union包含非平凡的类型,你不应该真的有一个空的union构造函数,这就是标准不这样做的确切原因本身。非平凡类型的隐含契约是它们的构造函数/析构函数将始终被调用以使实例处于可用状态,因此您不应该真正解决它。话虽如此,我意识到对于glm::vec3来说,这可能是一种小罪——因为它只是一个由三个标量组成的“盒子”,我认为不会有什么问题——事实上,这并不重要的是可能是偶然的。