Hello merciless社区,我今天依靠你的帮助。
请注意菜鸟的代码
错误在第20行(我会对其进行评论,以便您可以看到)。
错误:'printColorPicker :: printColorPicker(void)':尝试引用已删除的函数
#include <iostream>
using namespace std;
enum availableColors {
incolorPrint,
colorPrint
};
union printColorPicker {
struct incolorPrint {
int id;
char* details = "No color ink eh?";
} i;
struct colorPrint{
int id;
char* details = "Unicorn mode on";
} c;
} color; //line 20
void colorPicker(availableColors c){
char* option;
switch (c) {
case incolorPrint: {
option = color.i.details;
}
break;
case colorPrint: {
option = color.c.details;
}
break;
}
cout << option;
}
void main(){
colorPicker(colorPrint);
}
我想要做的是使用颜色选择器方法回显/ cout / printf colorPrint
联合内部的结构(incolorPrint
,printColorPicker
)内的字符串。
我得到了上面提到的错误。
答案 0 :(得分:0)
我并不精通union
疯狂,但可能发生的事情是当您提供details
的默认值时,实际上是在提供默认构造函数。 当发生这种情况时, struct
不再是聚合类型,也称为POD。这种非聚合传播,并且联合也不再是聚合类型,然后在构造时调用已删除的默认构造函数。 (聚合类型在构造时不调用构造函数,行为与C对象完全相同。)
编辑union
只要求其成员可以轻易构建。通过提供默认值,struct
将不再是简单的可构造的。允许使用private
/ protected
成员的聚合类型的差异。
解决此问题的方法是删除details
的默认值,并在构建后分配给它们,可能通过工厂函数。
BTW设置union
的不同对象的默认值没有意义,值应该是哪一个?