Как определить и получить доступ к безымянной структуре внутри анонимного объединения? - PullRequest
0 голосов
/ 03 апреля 2020

Может кто-нибудь объяснить, что не так с этой реализацией?

Я столкнулся со следующими ошибками

ошибка: класс хранения в анонимном агрегате в области действия класса не допускается

ошибка: использование удаленной функции 'ResultUnion :: ResultUnion ()'

#include<iostream>
#include<vector>
using namespace std;
enum MediaKind { Container, Music};
typedef vector<string> StringList;
struct ResultUnion {
  enum MediaKind kind;
  static union {
    struct { 
            string Type; 
            StringList List;
            bool searchable;
            }c; 
    struct { 
            string Type;
            uint32_t duration;
            }m;
   };
};

int main()
{
ResultUnion ResultUnionobj[2];
ResultUnionobj[0].kind = Container;
ResultUnionobj[0].c.Type = "Container";
ResultUnionobj[1].kind = Music;
ResultUnionobj[1].m.Type = "Music";
cout << "first:" << ResultUnionobj[0].c.Type << endl << "second:" << ResultUnionobj[1].m.Type;
}

1 Ответ

0 голосов
/ 03 апреля 2020

До C ++ 11:

Объединения не могут содержать элемент данных нестати c с нетривиальной специальной функцией-членом (конструктор копирования, оператор копирования-назначения или деструктор) .

И начиная с C ++ 11:

Если объединение содержит нестатический c элемент данных с нетривиальной специальной функцией-членом (copy / конструктор перемещения, назначение копирования / перемещения или деструктор), эта функция по умолчанию удаляется в объединении и должна быть явно определена программистом.

Если объединение содержит элемент данных нестандартного c с нетривиальным конструктором по умолчанию, конструктор объединения по умолчанию удаляется по умолчанию, если только вариантный член объединения не имеет инициализатора элемента по умолчанию.

( Декларация союза )

Короче говоря, string в союзе не очень хорошая идея.

...