错误:使用删除的function

我一直在编写朋友编写的一些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网页的代码的一部分

Edit2:在源代码中的任何地方都没有= delete()

一般来说,这个错误是什么意思? 发生这种types的错误时,我应该寻找什么?

我不认为其他答案提及=deleted; 语法是正确的。 错误消息清楚地表明默认的构造函数已被隐式删除。 它甚至说明了为什么:类包含一个非静态的constvariables,它不会被默认的ctor初始化。

 class X { const int x; }; 

由于X::xconst ,它必须被初始化 – 但是默认的ctor通常不会初始化它(因为它是一个PODtypes)。 因此,要得到一个默认的ctor,你需要自己定义一个(并且它必须初始化x )。 您可以通过参考成员获得相同的情况:

 class X { whatever &x; }; 

可能值得注意的是,这两者也会禁用赋值运算符的隐式创build,原因也大同小异。 隐式赋值操作符通常不会按成员进行赋值,但在这种情况下,不能因为该成员是不能分配的成员。 要进行分配工作,您需要编写自己的分配操作员。

这就是为什么一个const成员通常应该是静态的 – 当你做一个任务时,你不能指定const成员。 在一个典型的情况下,你所有的实例将具有相同的值,所以他们可能共享一个variables的访问权限,而不是拥有大量的具有相同值的variables副本。

当然,创build具有不同值的实例是可能的 – 例如,当您创build对象时,您可以传递一个值,因此两个不同的对象可以有两个不同的值。 但是,如果你试图做一些交换,那么const成员将保留原来的值而不是交换。

您正在使用一个标记为deleted
例如:

 int doSomething( int ) = delete; 

= delete是C ++ 0x的一个新特性。 这意味着一旦用户使用该function,编译器应立即停止编译并投诉“此function被删除”。

如果你看到这个错误,你应该检查=delete的函数声明。

要了解更多关于C ++ 0x中引入的新function,请查看。

gcc 4.6支持已删除函数的新function,您可以在其中编写

 hdealt() = delete; 

禁用默认的构造函数。

在这里,编译器显然已经看到一个默认的构造函数不能被生成,并且为你=delete它。

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

 MyClass() = delete; 

Gcc 4.6是第一个支持这种语法的版本,所以也许这是问题…

你可以试试这个吗? 我没有gcc-4.6

 class C { public: const int x ; } ; int main() { C c ; } 

如果这里的人是正确的,它应该给出类似的错误信息。

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

Interesting Posts