私はこのまったく同じ問題に出くわしました。ここで説明しているコードは、KITによる収縮階層の実装の一部です。
これは、gcc4.8でコードをコンパイルしようとしたときに発生する唯一のコンパイルエラーです。
@vitautによって提案された修正は、これを機能させるために必要なものです。ただし、main.cppにはすでに次の行が残っていることに注意してください。
// doesn't look nice, but required by the compiler (gcc 4)
...
const EliminationWeight::Type EliminationWeight::MAX_VALUE;
const EliminationWeight::Type EliminationWeight::MIN_VALUE;
EliminationWeight.hと一緒にEliminationWeight.cppファイルを作成し、それをMakefileに含めることにした場合、これらの行が上記とは異なるエラーを表示する理由です。
main.cpp:86:31: error: uninitialized const ‘EliminationWeight::MAX_VALUE’ [-fpermissive]
const EliminationWeight::Type EliminationWeight::MAX_VALUE;
^
main.cpp:87:31: error: uninitialized const ‘EliminationWeight::MIN_VALUE’ [-fpermissive]
const EliminationWeight::Type EliminationWeight::MIN_VALUE;
^
解決策は、main.cppでこれらの行を削除するか、実際の初期化に使用することです。私は後者を使用しましたが、行は次のようになります。
const EliminationWeight::Type EliminationWeight::MAX_VALUE = std::numeric_limits< EliminationWeight::Type >::max();
const EliminationWeight::Type EliminationWeight::MIN_VALUE = -std::numeric_limits< EliminationWeight::Type >::max();
typedefstd::numeric_limits
で定義されたタイプのテンプレートを使用したことに注意してください。EliminationWeight::Type
これは、別のタイプを使用するためにそのtypedefを変更するだけでよいことを意味します。
ただし、main.cppでこれらを使用するには、numeric_limits
テンプレートのヘッダーを含める必要があります。ヘッダーを含めなくても機能しましたが、他のインクルードファイルを介してインクルードされている可能性があります。クリーンなコードの目的のために、とにかくそれを含める必要があります。
#include <limits>
また、C ++ 11はテンプレートに新しい関数lowest
を提供しますnumeric_limits
。つまり、最後の行を次のように置き換えることができます。
const EliminationWeight::Type EliminationWeight::MIN_VALUE = std::numeric_limits< EliminationWeight::Type >::lowest();
ただし、のC ++リファレンスでlowest
は、浮動小数点型の戻り値を次のように指定しています。
実装に依存します。一般的に、max()の負の値
ですから、この機能を使って多くの利益が得られるかどうかはわかりません。見た目がすっきりしたコードになりますが、戻り値は多少指定されていないようです。