2016-07-05 13 views
0
struct Dingus { 
union { 
    int dingly[4 *4]; 
    vec3 dinglyDo; 
}diddly; 
inline Dingus() {} 
}; 

Dieser Code eines gelöschten Funktionsfehler mit anonymen Vereinigung zu verweisen, die Fehler SeltsamerVersuch

error C2280: 'Dingus::<unnamed-type-diddly>::<unnamed-type-diddly>(void)': attempting to reference a deleted function 

erzeugt, wenn ich die „diddly“ löschen, die einen Verweis auf die Vereinigung gab, gibt es keine Fehler .

Die vec3 ist eine Struktur aus der GLM-Bibliothek, ich kann den Typ mit einigen anderen Klassen ersetzen und ich werde den gleichen Fehler bekommen ... aber wenn ich es durch etwas Einfaches wie Float ersetze, bekomme ich das nicht Fehler

Da die „diddly“ entfernt den Fehler zu entfernen, dies scheint eine andere Frage als diese one

+2

Was ist 'Vec3'? – LogicStuff

+0

@LogicStuff Es ist eine Struktur aus der GLM-Bibliothek, ich kann den Typ durch einige andere Dinge ersetzen, und ich werde den gleichen Fehler bekommen ... aber wenn ich es durch etwas Einfaches wie Float ersetze bekomme ich den Fehler – Thomas

+0

Möglich Duplikat von [C++ 11 anonymous union mit nicht-trivialen Mitgliedern] (http://stackoverflow.com/questions/10693913/c11-anonymous-union-with-non-trivial-members) – PcAF

Antwort

3

Sie haben ein Mitglied dieser anonyme Union Typ deklariert zu sein, und so muss das Mitglied in initialisiert werden der Dingus Konstruktor. Da die Union ein Mitglied eines nicht-trivialen Typs ist, hat sie keinen Standardkonstruktor, daher kann sie im Dingus-Konstruktor nicht initialisiert werden.

Sie können einen Konstruktor für den Union-Typ definieren, der angibt, was passieren soll, wenn er standardmäßig erstellt wird, z.

struct Dingus { 
    union U { 
    int dingly[4 *4]; 
    vec3 dinglyDo; 
    U() : dingly() { } 
    } diddly; 
    inline Dingus() {} 
}; 
+2

All diese Vereinigungen wären nicht notwendig, wenn 'variant' es in den Standard geschafft hätte ... –

+0

@KerrekSB Vielleicht hat dieser Kommentar sie über die Kante geschoben. [Variante] (http://en.cppreference.com/w/cpp/utility/variant) –

+2

@FantasticMrFox: Ja. Das Komitee war unschlüssig darüber, ob er Zeit damit verbringen sollte, neue Richtungen zu erkunden, die damals stattfanden, wie "Knötchen", "Perzepte" und "Einhornsyntax", aber als dieser Kommentar eintraf, wurde alles fallen gelassen und national Körper hinter dem Convener in Chief ausgerichtet und begann Papier nach Papier zur Unterstützung der Variante zu senden. Einige warnten, dass wir in den nächsten zwanzig Jahren an Varianten arbeiten würden. Da war Gelächter. –

0

Ab c++17 können Sie std::variant statt einer Vereinigung, um dieses Problem zu lösen. Ihr Code könnte leicht ersetzt werden durch:

struct Dingus { 
    std::variant<std::array<int, 4*4>, vec3> diddly; 
    inline Dingus() {} 
}; 
+0

Sie können ein Array nicht in einer 'std :: variant' speichern, verwenden Sie ein' std :: array'. –

+0

@ JonathanWakely Obwohl ich es geändert habe, und ich weiß nicht, wie Sie sogar ein Array verwenden würden, kompiliert es ... http://coliru.stacked-crooked.com/a/5c4c50ffbc38722b –