我一直在处理一个朋友写的一些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’
编辑:这来自使用boost MSM的部分代码:Boost Webpage
Edit2:源代码中没有使用= delete()
。
一般来说,这个错误意味着什么?当发生这种类型的错误时,我应该寻找什么?
7条答案
按热度按时间j7dteeu81#
错误消息清楚地表明默认构造函数已被 * 隐式地 * 删除。它甚至说为什么:该类包含一个非静态的常量变量,该变量不会被默认ctor初始化。
因为
X::x
是const
,所以必须初始化它--但是默认的ctor通常不会初始化它(因为它是POD类型)。因此,要获得默认ctor,您需要自己定义一个(并且它必须初始化x
)。对于引用成员,您可以得到相同的情况:可能值得注意的是,这两种方法也将禁用赋值运算符的隐式创建,原因基本相同。隐式赋值运算符通常进行成员式赋值,但是对于const成员或引用成员,它不能这样做,因为成员不能被赋值。要使赋值有效,您需要编写自己的赋值运算符。
这就是为什么
const
成员 * 通常 * 应该是静态的--当您进行赋值时,无论如何都不能赋值const成员。在一个典型的情况下,所有的示例都将具有相同的值,所以它们也可以共享对单个变量的访问,而不是拥有一个变量的许多副本,这些副本都具有相同的值。当然,创建具有不同值的示例是可能的--例如,在创建对象时传递一个值,因此两个不同的对象可以具有两个不同的值。但是,如果您尝试执行诸如交换它们之类的操作,则const成员将保留其原始值,而不是被交换。
knsnq2tg2#
您正在使用一个标记为
deleted
的函数。例如:
=delete是C0x的一个新特性。这意味着一旦用户使用该函数,编译器应立即停止编译并报告“该函数已删除”。
如果你看到这个错误,你应该检查
=delete
的函数声明。要了解更多关于C0x中引入的这个新功能,请查看此内容。
vd2z7a6w3#
我在继承一个抽象类而没有实现子类中的所有纯虚方法时遇到了这个错误。
ubbxdtey4#
gcc 4.6支持删除函数的新特性,您可以在其中编写
禁用默认构造函数。
在这里,编译器显然已经看到了一个默认的构造函数不能被生成,并且
=delete
为您生成了它。hgb9j2n65#
在当前的C++0x标准中,你可以使用delete语法显式地禁用默认构造函数,例如:
GCC4.6是第一个支持这种语法的版本,所以也许这就是问题所在……
4smxwvx56#
从gcc 4.6切换到gcc 4.8为我解决了这个问题。
sigwle7e7#
如果在初始化
std::atomic
变量时出现以下错误:那么它就不能工作了,因为它使用了copy initialization,但是复制构造函数被显式删除了。
使用direct initialization代替: