тип string не работает в union
создаю в обьединение конструктор и пытаюсь использовать строки, но выдает ошибку на переменную типа структурыmaterial
union {
struct {
string gold, bronze, silver, platinum;
}material;
}jewel;
А вот и сама ошибка error C2621: член 'main::$UnnamedClass$0x682e279a$23$::material' объединения 'main::$UnnamedClass$0x682e279a$23$' имеет конструктор копий
Моя конечная цели инициализировать переменную gold, при условии что строки работают инициализация будет выглядеть так jewel.material.gold = "asd";
Ответы (2 шт):
Так нельзя. До с++11 есть явное ограничение https://en.cppreference.com/w/cpp/language/union
Unions cannot contain a non-static data member with a non-trivial special member function (copy constructor, copy-assignment operator, or destructor).
То есть, int можно, а string - уже нельзя.
После можно, но нельзя сделать в Вашем синтаксисе (либо я не знаю, как объявить конструктор для структур без имени.
В любом случае данная сущность немного странная и ее использование сильно ограничено. К примеру, нельзя писать в gold и читать с bronze.
Объединение очень сложный предмет. Чтобы всё работало вы должный прописать конструктор по умолчанию. Чтобы объединение знало кого инициализировать первым.
Стандарт c++11 :
[ Example: Consider the following union:
union U { int i; float f; std::string s; };
Since std::string (21.3) declares non-trivial versions of all of the special member functions, U will have an implicitly deleted default constructor, copy/move constructor, copy/move assignment operator, and destructor. To use U, some or all of these member functions must be user-provided. — end example ]
У вас нужно вручную вызвать конструктор для структуры material так :
# include <string>
union U {
struct S {
std :: string gold, bronze, silver, platinum;
}material;
U ():material{}{}
~U(){material.~S();}
}jewel;
Деструктор тоже вручную указывать надо какой элемент union нужно разобрать.