web-dev-qa-db-ja.com

エラー:削除された関数の使用

私は友人が書いたいくつかの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’

編集:これは、ブーストMSMを使用するコードの一部から来ています: Boost Webpage

Edit2:ソースコードのどこにも= delete()が使用されていません。

一般的に、このエラーはどういう意味ですか?このタイプのエラーが発生した場合、何を探す必要がありますか?

99
shuttle87

エラーメッセージは、デフォルトのコンストラクタが削除されたことを明確に示しています暗黙的に。それには、クラスに非静的なconst変数が含まれており、デフォルトのctorによって初期化されないという理由さえあります。

class X {
    const int x;
};

X::xconstであるため、初期化する必要がありますが、デフォルトのctorは通常それを初期化しません(PODタイプであるため)。したがって、デフォルトのctorを取得するには、自分で定義する必要があります(そして、xを初期化する必要があります)。参照であるメンバーで同じような状況を得ることができます:

class X { 
    whatever &x;
};

本質的に同じ理由で、これらの両方が代入演算子の暗黙的な作成も無効にすることに注意してください。暗黙的な代入演算子は通常、メンバーごとの代入を行いますが、constメンバーまたは参照メンバーでは、メンバーを割り当てることができないため、それを行うことはできません。割り当てを機能させるには、独自の割り当て演算子を作成する必要があります。

これがconstメンバーが通常静的である必要がある理由です-割り当てを行うとき、とにかくconstメンバーを割り当てることはできません。典型的な場合、すべてのインスタンスは同じ値を持つため、すべて同じ値を持つ変数のコピーをたくさん持つ代わりに、単一の変数へのアクセスを共有することもできます。

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

148
Jerry Coffin

deletedとしてマークされている関数を使用しています。
例えば:

int doSomething( int ) = delete;

= deleteはC++ 0xの新しい機能です。つまり、ユーザーがそのような関数を使用すると、コンパイラーはすぐにコンパイルを停止し、「この関数は削除されます」と文句を言う必要があります。

このエラーが表示された場合は、=deleteの関数宣言を確認する必要があります。

C++ 0xで導入されたこの新機能の詳細については、 this outを確認してください。

8
Alok Save

gcc 4.6は削除された関数の新しい機能をサポートします。

hdealt() = delete;

デフォルトのコンストラクタを無効にします。

ここで、コンパイラはデフォルトのコンストラクターを生成できないことを明らかに見ており、=delete 'あなたのためにそれをしました。

2
Bo Persson

Gcc 4.6からgcc 4.8に切り替えると、これが解決しました。

1

これを試してもらえますか? gcc-4.6を持っていません

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

ここの人々が正しい場合、同様のエラーメッセージが表示されます。

1
TonyK

現在のC++ 0x標準では、削除構文を使用してデフォルトのコンストラクターを明示的に無効にできます。

MyClass() = delete;

Gcc 4.6はこの構文をサポートする最初のバージョンなので、おそらくそれが問題です...

1
jarmond

抽象クラスから継承し、サブクラスのすべての純粋仮想メソッドを実装していないときに、このエラーが発生しました。

0
Christopher