2017-05-14 3 views
0

Bonjour la communauté impitoyable, je compte sur votre aide aujourd'hui.C++ Union/Struct 'printColorPicker :: printColorPicker (void)': tentative de référencement d'une fonction supprimée

S'il vous plaît voici le code

du Noob L'erreur est en ligne 20 (je vais commenter afin que vous puissiez voir).

Erreur: « printColorPicker :: printColorPicker (void) »: la tentative de faire référence à une fonction supprimée

#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); 
    } 

Ce que je suis en train de faire est d'utiliser la méthode de sélecteur de couleur pour faire écho/Cout/printf la chaîne à l'intérieur les structures (colorPrint, incolorPrint) à l'intérieur de l'union printColorPicker.

Je reçois l'erreur mentionnée ci-dessus.

+0

Donc le constructeur devrait avoir le nom de 'l'union', sans arguments? –

+0

TBH Je ne comprends pas pourquoi vous utilisez un 'union' dans votre code. –

+0

C'est un devoir, l'union est l'une des exigences. –

Répondre

0

Je ne suis pas très versé dans la folie union, mais ce qui se passe probablement quand vous fournissez une valeur par défaut pour details vous fournissez en fait un constructeur par défaut. Lorsque cela se produit, le struct n'est plus un type agrégé, également connu sous le nom POD. Ce non-agrégat se propage à travers, et l'union n'est également plus un type agrégé, qui appelle ensuite le constructeur par défaut supprimé lors de la construction. (Les types d'agrégat n'appellent pas le constructeur lors de la construction, se comportent exactement comme un objet C.)

EDIT union EDIT union requiert seulement que ses membres soient trivialement constructibles. En fournissant une valeur par défaut, le struct ne sera plus trivialement constructible. La différence avec les types agrégés étant private/protected membres sont autorisés.

La façon de résoudre ce problème consiste à supprimer les valeurs par défaut pour details et leur affecter après construction, éventuellement via une fonction d'usine.

BTW la définition des valeurs par défaut pour les différents objets d'un union n'a aucun sens, quelle devrait être la valeur?