C++ C++;Union/Struct';printColorPicker::printColorPicker(无效)和#x27;:试图引用已删除的函数

C++ C++;Union/Struct';printColorPicker::printColorPicker(无效)和#x27;:试图引用已删除的函数,c++,struct,reference,unions,C++,Struct,Reference,Unions,你好,无情的社区,我今天指望你的帮助 请看noob的密码 错误在第20行(我将对其进行注释以便您可以看到) 错误:“printColorPicker::printColorPicker(void)”:尝试引用已删除的函数 #include <iostream> using namespace std; enum availableColors { incolorPrint, colorPrint }; un

你好,无情的社区,我今天指望你的帮助

请看noob的密码

错误在第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);
    }
#包括
使用名称空间std;
枚举可用颜色{
彩色印刷品,
彩色印刷
};
联合印刷选色器{
结构不着色印刷{
int-id;
char*details=“没有彩色墨水吗?”;
}一,;
结构彩色打印{
int-id;
char*details=“独角兽模式开启”;
}c;
}色彩//第20行
无效颜色选择器(可用颜色c){
字符*选项;
开关(c){
不褪色印刷:{
选项=color.i.详细信息;
}
打破
外壳彩色打印:{
选项=颜色c.详细信息;
} 
打破
}

cout我对
union
的疯狂不太熟悉,但是当你为
details
提供一个默认值时,你实际上是在提供一个默认构造函数。当这种情况发生时,
struct
不再是聚合类型,也被称为POD。这种非聚合性通过nion也不再是聚合类型,它在构造时调用已删除的默认构造函数(聚合类型在构造时不调用构造函数,其行为与C对象完全相同)

EDIT
union
只要求其成员是可平凡构造的。通过提供默认值,
struct
将不再是可平凡构造的。允许聚合类型与受保护的
private
/
成员之间的差异

解决此问题的方法是删除
详细信息的默认值
,并在构建后分配给它们,可能是通过工厂函数


顺便说一句,为一个
联合体的不同对象设置默认值是没有意义的,值应该是哪一个?

因此构造函数应该有
联合体的名称,没有参数?我不明白你为什么在代码中使用
联合体。这是一个家庭作业,联合体是要求之一。看起来像ey在教你一些不好的东西。对不起,我的第一条评论是误导性的。如果你检查错误消息,你会更清楚地看到哪里出了问题。