Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:使用已删除的函数 我一直在研究一个朋友编写的C++代码,在编译Gcc4.6:时,我遇到了我以前从未见过的错误。 error: use of deleted function ‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed: uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’ 错误:使用已删除的函数 由于默认定义的格式不正确,因此隐式删除了“GameFSM_::hdealt::hdealt()”: 未初始化的非静态常量成员“const h\u t flopperGamefsm_u::hdealt::h”_C++_Gcc_G++_C++11_Deleted Functions - Fatal编程技术网

错误:使用已删除的函数 我一直在研究一个朋友编写的C++代码,在编译Gcc4.6:时,我遇到了我以前从未见过的错误。 error: use of deleted function ‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed: uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’ 错误:使用已删除的函数 由于默认定义的格式不正确,因此隐式删除了“GameFSM_::hdealt::hdealt()”: 未初始化的非静态常量成员“const h\u t flopperGamefsm_u::hdealt::h”

错误:使用已删除的函数 我一直在研究一个朋友编写的C++代码,在编译Gcc4.6:时,我遇到了我以前从未见过的错误。 error: use of deleted function ‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed: uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’ 错误:使用已删除的函数 由于默认定义的格式不正确,因此隐式删除了“GameFSM_::hdealt::hdealt()”: 未初始化的非静态常量成员“const h\u t flopperGamefsm_u::hdealt::h”,c++,gcc,g++,c++11,deleted-functions,C++,Gcc,G++,C++11,Deleted Functions,编辑:这来自使用boost MSM的部分代码: Edit2:在源代码中的任何位置都没有使用=delete() 一般来说,这个错误意味着什么?发生此类错误时,我应该查找什么?您正在使用一个标记为已删除的函数 例如: =delete是C++0x的一个新特性。这意味着一旦用户使用此函数,编译器应立即停止编译并抱怨“此函数已删除” 如果看到此错误,应检查函数声明中的=delete 要了解有关C++0x中引入的这个新特性的更多信息,请查看。在当前的C++0x标准中,您可以使用delete语法显式禁用默认构

编辑:这来自使用boost MSM的部分代码:

Edit2:在源代码中的任何位置都没有使用
=delete()


一般来说,这个错误意味着什么?发生此类错误时,我应该查找什么?

您正在使用一个标记为
已删除的函数

例如:

=delete是C++0x的一个新特性。这意味着一旦用户使用此函数,编译器应立即停止编译并抱怨“此函数已删除”

如果看到此错误,应检查函数声明中的
=delete


要了解有关C++0x中引入的这个新特性的更多信息,请查看。

在当前的C++0x标准中,您可以使用delete语法显式禁用默认构造函数,例如

MyClass() = delete;

GCC4.6是第一个支持这种语法的版本,所以可能这就是问题所在……

GCC4.6支持删除函数的新功能,您可以在其中编写

hdealt() = delete;
禁用默认构造函数


在这里,编译器显然看到无法生成默认构造函数,并且
=delete
'd为您创建了它。

错误消息清楚地表明默认构造函数已被隐式删除。它甚至还说明了原因:该类包含一个非静态常量变量,该变量不会由默认的ctor初始化

class X {
    const int x;
};
由于
X::X
const
,因此必须初始化它——但默认的ctor通常不会初始化它(因为它是POD类型)。因此,要获得默认的ctor,您需要自己定义一个ctor(并且它必须初始化
x
)。您可以与作为推荐人的成员获得相同的情况:

class X { 
    whatever &x;
};
可能值得注意的是,出于本质上相同的原因,这两种方法也将禁用赋值运算符的隐式创建。隐式赋值运算符通常会按成员进行赋值,但对于常量成员或引用成员,它不能这样做,因为无法赋值该成员。要使赋值有效,您需要编写自己的赋值运算符

这就是为什么
const
成员通常应该是静态的——当您进行赋值时,无论如何都不能赋值给const成员。在典型情况下,您的所有实例都将具有相同的值,因此它们可以共享对单个变量的访问,而不是共享具有相同值的变量的许多副本



当然,也可以创建具有不同值的实例——例如,在创建对象时传递一个值,因此两个不同的对象可以具有两个不同的值。但是,如果你试图做一些类似于交换它们的事情,const成员将保留其原始值,而不是被交换。

从gcc 4.6切换到gcc 4.8为我解决了这个问题。

我从抽象类继承时遇到了这个错误,并且没有在我的子类中实现所有纯虚拟方法。

以及您正在编译的代码?我更想知道错误意味着什么?我也需要发布代码吗?可能会有帮助,你也在使用boost吗?@Saskiha,是的,我在使用boost MSM。由于这是针对此类错误的第一次Google匹配-这里不是这种情况,但此类错误最常见的原因是在你向类中添加了一些自定义构造函数之后-因此编译器停止创建默认构造函数,如果该类的实例是通过默认构造函数创建的,则会出现此错误。只需显式添加默认构造函数。出于好奇,这样做什么时候会有帮助?@Peter:为了防止隐式转换。实际上它说的是“隐式删除,因为…”,上面的示例是显式的。@Peter R:看起来这是一个示例:@Downvoter:实际的错误消息是作为编辑发布的,最初发布的错误消息只是
C++错误:使用deleted function
gcc4.6是支持此语法的第一个版本
,我想这可以解释为什么我以前从未见过它,因为我最近才开始使用gcc4.6。多年来,我一直在gcc4.5中使用此语法。我的意思是天。啊,我一定一直在想GCC 4.6中的委托执行官。@Jeffry Coffin:实际的错误消息是作为编辑发布的,最初发布的错误消息只是
C++错误:使用删除的函数
@Als:对不起,我可能应该明确表示,我不想以此作为侮辱或其他任何事情,只是目前的情况表明,这些答案显然是不对的。我想你也许可以帮我解决我的问题,请:“这就是为什么一个const成员通常应该是静态的”——有趣的是,我以前从未遇到过这一点。所以,按照惯用的说法,如果我的类有一些属性在其生命周期中永远不会改变,而不是在构造上使用
const
,那么它应该是
private
,没有与之接触的非
const
公共接口?@OllieFord:这取决于。如果(例如)将该字段中具有一个值的对象指定给该字段中具有不同值的另一个对象,会发生什么情况?如果它应该被覆盖,那么它就不能是常量。如果根本不允许这样做,那么该值实际上可能是该类型的一部分(例如,模板参数,如果在编译时已知)。类似地,我通过从第二级基类派生
public virtual
,其中第一级基类有一个显式删除的defaul
class X { 
    whatever &x;
};