尝试引用已删除的函数时出错

Posted

技术标签:

【中文标题】尝试引用已删除的函数时出错【英文标题】:Error attempting to reference a deleted function 【发布时间】:2016-02-06 21:27:38 【问题描述】:

我想使用传递给初始化构造函数的参数来初始化Enemy::copy,但是我得到以下错误:

C2280: 'Enemy &Enemy::operator =(const Enemy &)': attempting to reference a deleted function

这里是class Enemy的声明:

 #include "Pickup.h"
 class Enemy : public Entity
 
 private:
        std::vector<Pickup>& copy;
 public:
        Enemy::Enemy(std::vector<Pickup>& arraypickup) : copy(arraypickup)  
 ;

还有来自main()的代码:

std::vector<Pickup> arraypickup;
Enemy enemy(arraypickup);

我该如何解决?

【问题讨论】:

您显示的来自main 的两行不会导致您发布的错误。它抱怨删除的复制构造函数。您的代码都没有使用复制构造。错误在别处。 可能enemy稍后会按值传递 后来复制没有任何反应,所以我不知道出了什么问题;/ Melchior,您指的是Enemy::copy。 CoryKramer 指的是 Enemy 类中的复制构造函数。您为该字段选择了一个非常不幸的名称。 问题很可能是你的名字奇怪的成员copy,它不是任何东西的副本,而是对你传递给构造函数的任何东西的引用。引用不可重新赋值,因此编译器不能为您的类隐式定义复制赋值运算符。因此,如果您尝试将某些内容复制到 Enemy,您会看到该错误。 【参考方案1】:

此答案基于@Praetorian 的正确建议。

简短回答:

问题出在Enemy 类的std::vector&lt;Pickup&gt;&amp; copy; 成员中。将其更改为 std::vector&lt;Pickup&gt; copy;,删除引用,以修复错误。实际上,绝对没有必要将vector 存储为引用,相反,正如您所看到的,在类中包含引用成员会导致您遇到的错误。您可能对 vector 是通过引用传递给初始化 c'tor 的事实感到困惑,但这绝不意味着您也应该使类成员成为引用。

如果您仍想通过引用存储 Enemy::copy 数据,例如性能问题,考虑将其设为指针,如下所示:

class Enemy : public Entity
 
 private:
        std::vector<Pickup>* copy;
 // rest of the class...
 ;

长答案:

重现问题的代码:

class Foo

    int& ri;
public:
//    default c'tor can't be defined in a sane fashion  because of the reference member ri
//    Foo() : ri(0) 
    Foo(int& _ri) : ri(_ri) 
;

int main(int argc, char **argv)

    int i42;
    Foo f1i;
    Foo f2f1; // we don't have a default constructor so using auto-generated copy c'tor
    f2 = f1; // <--- error
    return 0;

导致错误:

main.cpp: In function 'int main(int, char**)':
main.cpp:14:12: error: use of deleted function 'Foo& Foo::operator=(const Foo&)'
         f2 = f1; // <--- error
            ^
main.cpp:1:11: note: 'Foo& Foo::operator=(const Foo&)' is implicitly deleted
                     because the default definition would be ill-formed:
     class Foo
           ^
main.cpp:1:11: error: non-static reference member 'int& Foo::ri',
                      can't use default assignment operator

解释:

自动生成的operator=()(在这种情况下会生成 [1])被认为是 ill-formed,因为您无法在 C++ 中重新分配引用 [2] .自动生成的operator=(Foo&amp; other)(如果存在)将尝试执行this-&gt;ri = other.ri,这被认为是不正确的(编译器报告的“格式错误”),因为它是对引用@ 的重新分配987654340@.

最后,我建议看看 [3],对这个问题有一个深入的回答。

    about auto-generated copy assignment operator

    about re-assigning references

    Assignment operator and copy constructor in the presence of references

【讨论】:

以上是关于尝试引用已删除的函数时出错的主要内容,如果未能解决你的问题,请参考以下文章

【WPF高手进】WinForm中引用WPF项目出错!!!要崩溃了@@@

从集合中删除项目时出错[重复]

在方法中传递对派生对象的引用时出错

从 initializer_list 构造 std::map<T, unique_ptr<S>> 时出错

使用引用将结构传递给函数时出错[重复]

为啥会出错啊!???????