尝试引用已删除的函数时出错
Error attempting to reference a deleted function
我想使用传递给初始化构造函数的参数初始化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);
我该如何解决?
这个答案是基于@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 i{42};
Foo f1{i};
Foo f2{f1}; // 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
,这被认为是不正确的("格式错误",如编译器所报告的那样(,因为它是对引用ri
的重新分配。
最后,我建议看[3],对这个问题有深入的回答。
关于自动生成的复制赋值运算符
关于重新指定参照
存在引用的赋值运算符和复制构造函数
相关文章:
- 类中私有结构的构造函数出错
- 字符串验证函数出错
- 我的类默认构造函数出错
- Dev-C++和Code::Blocks中的析构函数出错
- int对的哈希函数出错
- MSVC 编译器错误导致迭代器和友元函数出错
- 复制构造函数出错
- 使用 WinSock2 开发,使用 CreateThread() 函数出错
- 链接列表的Push_back函数出错
- 结构初始化中的隐式复制构造函数出错
- 异步函数出错
- 编译器错误消息错误:令牌之前的预期')' '*'。我的构造函数出错
- c++中使用std::bind和std::函数出错
- 在vector排序中使用c++模板函数出错
- 使用std::for_each lambda函数出错
- 二叉搜索树插入函数出错
- 调用类的函数出错
- c++使用删除函数出错
- 使用已删除的函数出错
- 调用构造函数出错