2013-02-19 11 views
5

-Code hat:Vereinigung kann ein Objekt nicht enthalten, die eine virtuelle Funktion

struct A{ 
    int a; 
    virtual void f(){} 
}; 
union B{ 
    A ob; 
}; 

Kompilierzeitfehler:

C:\to\main.cpp|9|error: member 'A B::ob' with constructor not allowed in union| 
C:\to\main.cpp|9|error: member 'A B::ob' with copy assignment operator not allowed in union| 
||=== Build finished: 2 errors, 0 warnings ===| 

C++ 03 Standard:

An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects. If a union contains a static data member, or a member of reference type, the program is ill-formed.

Die Sta ndard sagt nichts über ein Objekt einer Klasse mit einer virtuellen Funktion, und der Compiler klagen über den Konstruktor und den Kopierzuweisungsoperator, den ich nicht benutzt habe. Ist das ein Compiler Bug? Ich benutze gcc.

+0

von nicht-trivial, denken POD (http://en.wikipedia.org/wiki/Plain_old_data_structure) – Benj

+0

@Benj ich nicht weiß, was nicht-trivial bedeutet, aber ich bin sicher, es ist nicht POD, da A eine Basisklasse haben kann, in diesem bekomme ich keinen Fehler, so dass Gewerkschaftsmitgliedsdaten kein POD sein müssen. – AlexDan

+0

Wenn Sie den Artikel, auf den ich verwiesen habe, sehen, werden Sie sehen, dass Gewerkschaften speziell in Bezug auf POD erwähnt werden. Es ist auch möglich, dass eine Klasse POD ist. – Benj

Antwort

10

Der implizit deklarierte Standardkonstruktor, Kopierkonstruktor und Kopierzuweisungsoperator für diese Struktur ist nicht-trivial, da er eine virtual-Funktion hat, sodass Sie diese Anforderungen nicht erfüllen können.

A constructor is trivial if it is an implicitly-declared default constructor and if:

  • its class has no virtual functions (10.3) and no virtual base classes (10.1), and
  • [...]

A copy constructor for class X is trivial if it is implicitly declared and if

  • class X has no virtual functions (10.3) and no virtual base classes (10.1), and
  • [...]

A copy assignment operator for class X is trivial if it is implicitly declared and if

  • class X has no virtual functions (10.3) and no virtual base classes (10.1), and
  • [...]

Das C++ 11 Zitat ähnlich ist (es enthält nur bewegen und Zuweisungsoperator), aber C++ 11 nicht die gleiche Anforderung Gewerkschaften Mitglieder hat.

+0

Kurz, süß und auf den Punkt. –

0

Verwenden von C++ 11, wenn Sie können, ist es nicht so Einschränkung enthält

+0

Es hat andere Einschränkungen, die es extrem schwierig machen anstatt unmöglich. –

Verwandte Themen