尝试引用已删除的函数时出错
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<Pickup>& copy;
成员中。将其更改为 std::vector<Pickup> 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& other)
(如果存在)将尝试执行this->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项目出错!!!要崩溃了@@@