错误C2280:声明C+;时尝试引用已删除的函数+;结构 我有以下C++代码(在VS2017):
当我试图声明此结构时:错误C2280:声明C+;时尝试引用已删除的函数+;结构 我有以下C++代码(在VS2017):,c++,c++11,struct,constructor,visual-studio-2017,C++,C++11,Struct,Constructor,Visual Studio 2017,当我试图声明此结构时: int main() { Outer obj; }; 我得到编译错误: 错误C2280:'Outer::Outer(void)':尝试引用已删除的 作用 这种声明结构的方式应该可以正常工作。我觉得这个错误与结构的构造函数有关 如何解决此问题?根据: 如果联合包含具有非平凡 特殊成员函数(复制/移动构造函数、复制/移动赋值、, 或析构函数),该函数在union和 需要由程序员明确定义 因此,您需要在internal中为联合定义构造函数和析构函数。但因为这是一个匿名
int main()
{
Outer obj;
};
我得到编译错误:
错误C2280:'Outer::Outer(void)':尝试引用已删除的
作用
这种声明结构的方式应该可以正常工作。我觉得这个错误与结构的构造函数有关
如何解决此问题?根据:
如果联合包含具有非平凡
特殊成员函数(复制/移动构造函数、复制/移动赋值、,
或析构函数),该函数在union和
需要由程序员明确定义
因此,您需要在internal
中为联合定义构造函数和析构函数。但因为这是一个匿名联盟,你必须先给它起个名字:
struct Inner
{
int b;
union A {
A();
~A();
OptionA optA;
OptionB optB;
} Options;
};
你的问题在于
union {
OptionA optA;
OptionB optB;
}Options;
在内部
中。OptionA
和OptionB
都是可构造的,因此当您对它们进行并集时,它会删除并集的构造函数。这意味着选项
不是默认可构造的,因此内部
也不是,因为您没有提供默认构造函数
您需要为联合提供自己的构造函数和析构函数,以处理构造和析构函数正确的成员。您可以看到如何创建标记的并集以正确地销毁该并集
union {
OptionA optA;
OptionB optB;
}Options;