1. ホーム
  2. c++

[解決済み】エラー:削除された関数の使用

2022-02-14 13:59:13

質問内容

友人が書いた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を使ったコードの一部からきています。 ブースト・ウェブページ

編集2: = delete() はソースコードのどこにも使われていません。

一般的に、このエラーは何を意味するのでしょうか?このタイプのエラーが発生した場合、何を確認すればよいのでしょうか?

解決方法は?

エラーメッセージには、デフォルトのコンストラクタが削除されたことが明確に書かれています。 暗黙のうちに . その理由は、クラスが非静的な const 変数を含んでおり、デフォルトのコンテナでは初期化されないからです。

class X {
    const int x;
};

以降 X::xconst しかし、デフォルトのコー タは通常これを初期化しない(POD型だから)。したがって、デフォルトのコー タを使うには、自分で定義する必要があります(そして、そのコー タは x ). 同じような状況は、参照であるメンバーでも得られます。

class X { 
    whatever &x;
};

この2つは、本質的に同じ理由で、代入演算子の暗黙の生成も無効化することに注目すべきかもしれません。暗黙の代入演算子は通常メンバー単位の代入を行いますが、constメンバーや参照メンバーでは、そのメンバーが代入できないため、代入ができません。代入を機能させるには、独自の代入演算子を書く必要があります。

このため const メンバーは 通常 代入を行う場合、const メンバはどうせ代入できないからです。典型的なケースでは、すべてのインスタンスが同じ値を持つことになるので、同じ値を持つ変数のコピーをたくさん持つ代わりに、1つの変数へのアクセスを共有したほうがよいでしょう。

もちろん、異なる値を持つインスタンスを作成することは可能です。たとえば、オブジェクトを作成するときに値を渡しますから、2つの異なるオブジェクトが2つの異なる値を持つことは可能です。しかし、それらを入れ替えるようなことをしようとすると、constメンバは入れ替えられるのではなく、元の値を保持することになる。