【问题标题】:error C2280: attempting to reference a deleted function while declaring a C++ struct错误 C2280:在声明 C++ 结构时尝试引用已删除的函数
【发布时间】:2018-08-17 20:24:45
【问题描述】:

我有以下 C++ 代码(在 VS2017 中):

struct OptionA
{
    std::string s1;
};

struct OptionB
{
    std::string s2;
};

struct Inner
{
    int b;
    union {
        OptionA optA;
        OptionB optB;
    }Options;

};

struct Outer
{
    int a;
    Inner b;
}

当我试图声明这个结构时:

int main()
{
   Outer obj; 
};

我得到编译错误:

错误 C2280: 'Outer::Outer(void)': 试图引用已删除的 功能

这种声明结构的方式应该可以正常工作。感觉这个错误跟结构的构造函数有关。

我该如何解决这个问题?

【问题讨论】:

    标签: c++ c++11 struct constructor visual-studio-2017


    【解决方案1】:

    你的问题是

    union {
        OptionA optA;
        OptionB optB;
    }Options;
    

    InnerOptionAOptionB 都不是简单可构造的,因此当您将它们联合时,它会删除联合的构造函数。这意味着Options 不是默认可构造的,因此Inner 也不是,因为您没有提供默认构造函数。

    您将需要为联合提供自己的构造函数和析构函数来处理正确成员的构造和析构。您可以查看如何制作标记联合以正确破坏联合here

    【讨论】:

      【解决方案2】:

      根据this

      如果联合包含具有非平凡数据成员的非静态数据成员 特殊成员函数(复制/移动构造函数,复制/移动赋值, 或析构函数),默认情况下该函数在联合中被删除,并且 需要程序员明确定义。

      所以你需要在Inner 中为你的联合定义构造函数和析构函数。但是因为是匿名联合,所以要先给它起个名字:

      struct Inner
      {
          int b;
          union A {
              A();
              ~A();
              OptionA optA;
              OptionB optB;
          } Options;
      };
      

      【讨论】:

        猜你喜欢
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 2021-11-13
        • 1970-01-01
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多