153

私は友人が書いたいくつかの 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()どこにも使用されていません。

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

4

6 に答える 6

197

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

class X {
    const int x;
};

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

class X { 
    whatever &x;
};

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

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

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

于 2011-05-11T15:35:31.880 に答える
12

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

int doSomething( int ) = delete;

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

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

C++0x で導入されたこの新機能の詳細については、こちらをご覧ください

于 2011-05-11T15:28:50.280 に答える
4

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

hdealt() = delete;

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

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

于 2011-05-11T15:32:42.217 に答える
2

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

MyClass() = delete;

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

于 2011-05-11T15:30:54.420 に答える
1

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

于 2013-12-13T21:14:27.220 に答える