6

パッケージに付属のテストコードを実行して、Eigen の NonLinear Optimization 機能をテストしようとしています。

私はこれらのエラーで立ち往生しています(むしろ困惑しています):

Error   5   error C2039: 'please_protect_your_min_with_parentheses' : is not a member of 'std::numeric_limits<double>'  c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    184
Error   7   error C2039: 'please_protect_your_min_with_parentheses' : is not a member of 'std::numeric_limits<double>'  c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    28
Error   6   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    184
Error   8   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    28

ちなみに、(私が思うに)これを引き起こす行は次のようになります。

#define min(A,B) please_protect_your_min_with_parentheses

エラーは次の行を参照しています (上記の 28 行目と 184 行目の 2 つの異なる場所にあります)。

const Scalar dwarf = std::numeric_limits<Scalar>::min();

どんなアドバイスでも大歓迎です

4

1 に答える 1

8

行を次の行に変更するように要求されます。

const Scalar dwarf = (std::numeric_limits<Scalar>::min)();

そのため、min関数のようなマクロが定義されている場合、それは置き換えられません。

問題は、Microsoft Windowsヘッダーがマクロを定義するため、minWindowsヘッダーを含む標準のC++コードがコンパイルに失敗する可能性があることです。ポータブルC++ライブラリが実装するソリューションはmin、上記のように、標準関数への呼び出しを括弧で囲むことです。コンパイルするテストコードは、この手法がコードで使用されていることを確認しているようです。

上記のアプローチの問題は、min(a,b)括弧を追加すると名前が引数とは無関係にルックアップされるため、引数に依存するルックアップで非修飾呼び出しを実行できないことです。

min彼女自身のコードに適用できるもう1つの解決策は、Windowsヘッダーを含める前、または/maxマクロの定義を解除する前に、NOMINMAXフラグを定義することです。ライブラリコードはユーザーコードの構成を微調整することを想定していないため、これは通常、ライブラリコードによって実行されません。

于 2012-12-03T21:19:58.553 に答える