C ++ Union / Struct'printColorPicker :: printColorPicker(void)':尝试引用已删除的函数

时间:2017-05-14 19:02:54

标签: c++ struct reference unions

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联合内部的结构(incolorPrintprintColorPicker)内的字符串。

我得到了上面提到的错误。

1 个答案:

答案 0 :(得分:0)

我并不精通union疯狂,但可能发生的事情是当您提供details的默认值时,实际上是在提供默认构造函数。 当发生这种情况时,struct不再是聚合类型,也称为POD。这种非聚合传播,并且联合也不再是聚合类型,然后在构造时调用已删除的默认构造函数。 (聚合类型在构造时不调用构造函数,行为与C对象完全相同。)

编辑union只要求其成员可以轻易构建。通过提供默认值,struct将不再是简单的可构造的。允许使用private / protected成员的聚合类型的差异。

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

BTW设置union的不同对象的默认值没有意义,值应该是哪一个?