问题标签 [deleted-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
140 浏览

c++ - 访问已删除函数的 C++ 错误 (C2280)

所以,我试图用 opengl 和 sfml 制作一个 2d 游戏,所以我在输入命名空间中创建了一个按钮类,我在其中创建了一个 render() 函数,但是当我调用它时(无论我使用指针还是我没有)即使我传递了所有必需的参数,它仍然给我一个错误,说我正在尝试访问一个已删除的函数,这是 Button 标题:

这是 Button.cpp:

这是 main.cpp 代码:

我已经搜索了 microsoft docs 和其他 stackoverflow 问题,但我找不到像我这样的案例,希望有人能提供帮助,谢谢

0 投票
2 回答
110 浏览

c++ - 解决由于具有可能已删除的默认构造函数的不变成员而导致的编译器错误

我已经按此顺序提出了一系列与相同源代码相关的问题:

  1. 在结构和模板中试验联合和位域
  2. 试图翻转stdbitset中的位顺序
  3. 避免重载解析中的歧义

我还在 Code Review 上提出了一系列相关的问题。

  1. 通过实验与联合位域结构和模板专业化模拟虚拟寄存器
  2. 模拟虚拟寄存器第 2 部分

这应该可以让您大致了解我的原始代码设计,并提供参考和背景信息。从那时起,我开始查看我的工作代码,并希望进一步简化它。

然后我决定删除模板特化,让我的寄存器类默认为 64 位宽而不是 8 位,同时专门化高阶大小的寄存器。

我试图将人们可以通过以下任何一种方式访问​​数据的想法结合起来:

  • 完整值: - 整个 64 位 qword
  • 半值: - 2 个单独的 32 位双字
  • 四分之一值 - 4 个单独的 16 位字
  • 第八个值 - 8 个单独的 8 位字节

并且通过实用程序的使用,std::bitset可以轻松访问完整 64 位寄存器中的任何位。通过使用联合,我应该能够正确映射内存,以便可以将寄存器表示为并由以下任何组合访问:

  • std::bitset<64> qword
  • std::bitset<32> dword[2]
  • std::bitset<16> word[4]
  • std::bitset<8> byte[8]

使用联合的概念是在内存中有一个空间,代表任何给定寄存器的 64 位。现在我试图让我的 Register 类可以轻松复制。

因此,我将上面链接中的原始代码修改为更简单的版本:

寄存器.h

然后我想测试以确保到目前为止的所有内容都可以轻松复制。所以我运行这个短程序。

主文件

我得到这个输出:

现在,当查看 union Bits 时,它声明它是可简单复制的。因此,不要将结构中的 Bits 类型的变量声明为其数据成员;我相信我们应该能够在我们的结构中拥有一个匿名联合,这样我们就可以直接访问我们的 qword、dwords、单词和字节。所以现在这个类看起来像这样:

然后我在我们的 main.cpp 中运行这行代码

我得到这个输出:

好的,到目前为止一切都很好。

现在我正在处理对 Register 对象进行操作的函数。它将反转从先前提出的问题中看到的位顺序。除了在这种情况下,我没有使用模板。Register.h所以在这里我在我的课后声明函数原型:

然后我创建了一个Register.cpp文件来实现这个功能。

注册.cpp

所以现在我已经编写了函数,我清理了我的解决方案,现在我尝试编译“Register.h”。然而; 我收到此编译器错误 frpm Visual Studio 2017 ,语言设置设置为最新的草案标准或标志(/std:c++latest)

因此,当我单击错误 C2280 时,它会将我引导至我的寄存器变量的声明cpy。当我将鼠标光标移到变量上方时,cpy它会给我以下消息:

vpc::注册cpy

“vpc::Register”的默认构造函数不能被引用——它是一个被删除的函数

所以我的问题变成了:如果之前的所有内容都可以轻松复制,为什么要删除默认构造函数?因为我现在在一个函数中使用它,突然之间,它表明我的结构有一个不变的成员,它没有一个可简单复制的构造函数,并且它指向Register::value了罪魁祸首。是什么原因造成的,如何以及为什么?我能做些什么来修复或解决这个问题?

0 投票
1 回答
359 浏览

c++ - 在 c++20 中使用删除的默认构造函数初始化聚合

有一个包含 POD 的结构和已删除的默认构造函数。当使用-std=c++2a. 相同的代码与-std=c++17.

https://godbolt.org/z/xlRHLL

0 投票
2 回答
180 浏览

c++ - =delete 函数的继承

假设我有一个名为File. File例如,我想为 的每个儿子禁用复制构造函数TextFile

做这样的事情仍然会禁用复制构造函数TextFile吗?

或者为了禁用它是否有必要?

0 投票
0 回答
52 浏览

c++ - 为什么用删除的构造函数创建的这个临时编译?

这段代码:

现场演示在这里

可以说我假设它不会编译(因为我们正在调用已删除的构造函数)。为什么它可以在我尝试过的任何编译器上编译?

我注意到不使用统一初始化,编译代码会导致预期的错误。那么为什么在存在已删除构造函数的情况下仍然允许(聚合?)初始化?

0 投票
0 回答
49 浏览

c++ - 包含 `std::unique_ptr` 是否会使默认复制构造函数成为已删除的函数?

不允许复制的事实unique_ptr意味着不超过一个对象可以共享相同的底层数据。如果我在我的类中包含一个对象,unique_ptr编译器是否足够明智地使隐式复制构造函数成为已删除的函数?

如果我取消注释用户定义的复制构造函数的定义,那么只要没有复制unique_ptr那里就一切正常。

0 投票
2 回答
128 浏览

c++ - 如果 Struct 包含互斥体,则 C++ 将初始化器列表推送到标准向量上的问题

我目前正在使用 C++ 开发一个项目,在该项目中,我有一个存储在向量中的结构列表,其中有很多与它们相关的处理。为了加快速度,我选择将程序拆分为多个线程,而我选择这样做的懒惰方式是向标准库向量中的每个结构添加一个互斥体。这样,我可以让多个线程遍历数组,并通过调用 mutex.try_lock() 来获取各个元素的所有权,并完成与该元素的关联处理,或者移至下一个打开的元素。

在我们开始之前,请注意以下内容确实有效。

所以,我打算以与上面非常相似的方式填充我的标准向量,但它不起作用。

编译器错误:

我相当肯定这是说这不起作用的原因是该结构试图调用互斥体的复制构造函数,而实际上它没有复制构造函数。我明确不想这样做。

我最初的想法是,为了确保它甚至不会尝试调用互斥锁的复制构造函数,我可以为我的类创建自己的构造函数,并且基本上明确地省略了互斥锁的复制。这种方法看起来像这样 -但它也不起作用。

编译器错误:

关于解决这个问题的任何想法?我希望保持代码相对简单,但我不确定如何使标准向量运行,或者至少正确使用它。

0 投票
1 回答
320 浏览

c++ - 相等运算符试图引用已删除的函数数组

我正在使用 SFML 用 C++ 创建一个太空侵略者克隆。我对 C++ 很陌生,我在做这个项目时正在学习它。

尝试使用构造函数和数组为每个创建的敌人设置设置来创建新敌人时,出现以下错误:

敌人构造器:

敌人装载机方法

敌人头文件:

我在论坛上读到这个问题与使用对象的副本而不是原始对象有关,但是我不确定如何处理这个问题以引用我正在修改的原始对象。

要重现为 Enemy.cpp 类创建构造函数,请使用 for loop in 方法创建一个实体 Enemy alien,如 Enemy::loader 所示,并将创建的实体存储在 Enemy alienArray 中,如索引所示。

0 投票
1 回答
91 浏览

c++ - 试图找到已删除的函数

在 C++ 中乱搞类,遇到一个错误,指出我试图引用一个已删除的函数。这是错误

C2280(Test &Test::operator = (const Test& : 试图引用已删除的函数)。

这是我的代码:

问题出main()在等号上。

0 投票
2 回答
97 浏览

c++ - 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?

仅在GCCClang中测试,基类中存在按值传递的复制赋值运算符(在实现复制和交换(或复制和移动)习语时很有用)导致复制赋值运算符在要隐式删除的派生类。

Clang 和 GCC 对此表示同意;为什么会这样?

示例代码: