错误:使用删除的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::x
是const
,它必须被初始化 – 但是默认的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为我解决了这个问题。