cpprestsdkとEigenを使用している環境で、コンパイルしようとすると次のエラーが出ました。
C4002 関数に似たマクロ呼び出し 'U' の引数が多すぎます BDCSVD.h 1087
C4002 関数に似たマクロ呼び出し 'U' の引数が多すぎます BDCSVD.h 1089
C3861 'Li': 識別子が見つかりませんでした BDCSVD.h 1089
C3861 'Ln': 識別子が見つかりませんでした BDCSVD.h 1087
検索してみると似たようなエラーを発見。
同じくBDCSVD.hでC4002を引いているようです。
これによると、cpprestsdkで使用しているU
というマクロ(参照)とEigenで使用しているU
というマクロ(参照)が競合しているようです。
具体的には、BDCSVD.hよりも先にcpprestsdk側のU
が定義されてしまうと、コンパイルエラーになってしまうようです。
応急処置でこのように解決しました。
BDCSVD.h
#ifdef U
#define EIGEN_INTERNAL_U_PROTECTOR U
#undef U
#endif
// 元のソースコード
#ifdef EIGEN_INTERNAL_U_PROTECTOR
#define U EIGEN_INTERNAL_U_PROTECTOR
#undef EIGEN_INTERNAL_U_PROTECTOR
#endif
BDCSVD.hの最初と最後に上記のようなコードを追記します。
これでU
を一旦別のマクロに避難させておき、コード終端で再びU
にdefineします。
こうすることでコンパイルエラーは出なくなりました。