我一直在编写一位朋友写的一些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()。
一般来说,这个错误是什么意思?当这种类型的错误发生时,我应该寻找什么?
发布于 2011-05-11 23:35:32
错误消息清楚地表明默认构造函数已被隐式删除。它甚至说明了原因:该类包含一个非静态的const变量,该变量不会被默认的ctor初始化。
class X {
const int x;
};由于X::x为const,因此必须对其进行初始化--但默认的ctor通常不会对其进行初始化(因为它是POD类型)。因此,要获得默认的ctor,您需要自己定义一个(并且它必须初始化x)。你可以用一个引用的成员得到同样的情况:
class X {
whatever &x;
};可能值得注意的是,由于本质上相同的原因,这两种方法还将禁用赋值操作符的隐式创建。隐式赋值运算符通常执行成员级赋值,但对于常量成员或引用成员,它无法执行此操作,因为该成员无法被赋值。要使赋值工作,您需要编写自己的赋值运算符。
这就是为什么const成员通常应该是静态的--当您进行赋值时,无论如何都不能给const成员赋值。在典型情况下,所有实例都将具有相同的值,因此它们可能会共享对单个变量的访问权限,而不是拥有大量具有相同值的变量副本。
当然,也可以创建具有不同值的实例--例如,在创建对象时传递一个值,因此两个不同的对象可以有两个不同的值。但是,如果您尝试交换它们,const成员将保留其原始值,而不是被交换。
发布于 2011-05-11 23:28:50
您正在使用一个标记为deleted的函数。
例如:
int doSomething( int ) = delete;=delete是C++0x的一个新特性。这意味着一旦用户使用了这个函数,编译器应该立即停止编译,并抱怨“这个函数被删除了”。
如果您看到此错误,则应检查函数声明中是否有=delete。
要了解有关C++0x中引入的这个新特性的更多信息,请查看this。
发布于 2011-05-11 23:32:42
gcc 4.6支持删除函数的新功能,您可以在其中编写
hdealt() = delete;若要禁用默认构造函数,请执行以下操作。
在这里,编译器显然已经看到不能生成默认构造函数,并且=delete为您创建了它。
https://stackoverflow.com/questions/5966698
复制相似问题