Может ли кто-нибудь объяснить, как использовать и получать доступ к строке в объединении внутри структуры с помощью неограниченного объединения?
#include <iostream>
#include <string>
using namespace std;
typedef struct {
int height;
int width;
} Page;
typedef struct {
int test;
union {
Page page;
int intVar;
string stringVar;
} VarUnion;
} VariableDataStruct;
int main()
{
VariableDataStruct structeg;
structeg.VarUnion.stringVar = "Hello";
return 0;
}
В настоящее время возникают следующие ошибки при компиляции:
unionstring2.cc: В функции ‘int main ()’: unionstring2.cc:22:24: ошибка: использование удаленной функции «VariableDataStruct :: VariableDataStruct ()» VariableDataStruct Structeg; ^ unionstring2.cc:11:16: примечание: «VariableDataStruct :: VariableDataStruct ()» неявно удаляется, потому что определение по умолчанию будет неправильно сформировано: typedef struct { ^ unionstring2.cc:11:16: ошибка: использование удаленной функции «VariableDataStruct ::: :()» unionstring2.cc:13:19: note: ‘VariableDataStruct ::: :()’ неявно удаляется, потому что определение по умолчанию будет неправильно сформировано: union { ^ unionstring2.cc:16:11: ошибка: член объединения ‘VariableDataStruct :::: stringVar’ с нетривиальным ‘std :: basic_string <_CharT, _Traits, _Alloc> :: basic_string () [с _CharT = char; _Traits = std :: char_traits; _Alloc = std :: allocator] ’ string stringVar; ^ unionstring2.cc:11:16: ошибка: использование удаленной функции «VariableDataStruct :::: ~ ()» typedef struct { ^ unionstring2.cc:13:19: примечание: ‘VariableDataStruct :::: ~ ()’ неявно удаляется, потому что определение по умолчанию будет неправильно сформировано: union { ^ unionstring2.cc:16:11: ошибка: член объединения ‘VariableDataStruct :::: stringVar’ с нетривиальным ‘std :: basic_string <_CharT, _Traits, _Alloc> :: ~ basic_string () [с _CharT = char; _Traits = std :: char_traits; _Alloc = std :: allocator] ’ string stringVar; ^ unionstring2.cc:22:24: ошибка: использование удаленной функции «VariableDataStruct :: ~ VariableDataStruct ()» VariableDataStruct Structeg; ^ unionstring2.cc:18:11: примечание: ‘VariableDataStruct :: ~ VariableDataStruct ()’ неявно удаляется, потому что определение по умолчанию будет неправильно сформировано: } VariableDataStruct; ^ unionstring2.cc:18:11: ошибка: использование удаленной функции «VariableDataStruct :::: ~ ()»
Ошибка, которую вы получаете, связана не с доступом к union
, а с невозможностью создать экземпляр вашего struct
:
error: use of deleted function ‘VariableDataStruct::VariableDataStruct()’
Вам необходимо предоставить конструктор для вашего struct
, который разумно инициализирует union
.
Союзы с членами с нетривиальными специальными функциями-членами (конструктор, присваивание, деструкторы) (например, std::string
) также должен определять эти специальные функции. Поскольку в этом объединении не указывается, какой член используется в настоящее время, эти специальные функции-члены не могут быть определены.
Вместо этого используйте std::variant<Page, int, std::string>
.