Visual Studio がデバッグ モードの場合、Eigen ライブラリが MFC プロジェクトに含まれていると定義の競合の問題が発生します。

Visual Studio がデバッグ モードの場合、Eigen ライブラリが MFC プロジェクトに含まれていると定義の競合の問題が発生します。

エラーメッセージ

Eigen\src\Core\PlainObjectBase.h(143,5): エラー C2061: 構文エラー: 識別子 "THIS_FILE"
Eigen\src\Core\PlainObjectBase.h(143,1): エラー C2333: "Eigen::PlainObjectBase: : 「operator new」: 関数宣言のエラー; 関数本体をスキップします
Reigen\src\Core\CwiseNullaryOp.h(341,27): エラー C2039: “setConstant”: “Eigen::PlainObjectBase” のメンバーではありません

上記はエラー メッセージの一部にすぎません。Visual Studio がコンパイルしてエラーを報告するときは、「エラー一覧ウィンドウ」ではなく、「出力」ウィンドウを見てください。出力ウィンドウで「error」を検索すると、最初のエラー メッセージの位置がわかり、エラーの原因をすぐに見つけることができます。
以下に示すように:
ここに画像の説明を挿入

解決

エラーメッセージによると、「THIS_FILE」はdebugMFCモードで有効化されるマクロで、デバッグ時にメモリリークの箇所を特定するのに便利で、これに関連したエラーメッセージと思われます。で定義されたマクロ
には、なども含まれます。推測では、演算子がオーバーロードされており、 Eigen でも演算子がオーバーロードされていると思われます。後から Erigen を含めると、不明瞭なエラーが発生します。したがって、Eigen のインクルード場所を定義の前に置いてみてください。具体的には、次のように、Eigen を含むコード内のマクロ定義の場所を見つけます。THIS_FILEDEBUG_NEWDEBUG_NEWnewnewDEBUG_NEWnew
DEBUG_NEWDEBUG_NEW

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

コードセグメントの前に include ステートメントを配置するだけです。メモリ リークを検出する必要がない場合は、このコードを直接削除することもできます。

他の場所でこのような問題が発生した場合、解決策は、他のさまざまなライブラリをインクルードする前に、Eigen のインクルード位置を調整して、Eigen をインクルードするだけです。たとえば、boost関連するヘッダー ファイルをインクルードする前にインクルードしますEigen/Core

おすすめ

転載: blog.csdn.net/qq_42679415/article/details/132122406