Thrustにはgeneric
という名称の名前空間(例えば、thrust::detail::backend::generic
)があって、これがC++/CLIのgenericキーワードと衝突している。
これが原因でC2059コンパイルエラーで、コンパイルできない。
どうやら既知のバグらしく、解決方法も書いてあった。つまり
error.cpp
#include <thrust/device_vector.h>
とThrustをインクルードしているところの前後
ok.cpp
#define generic THRUST_GENERIC
#include <thrust/device_vector.h>
#undef generic
と強制的に変えてやれば通る。
ただ、これ全部のヘッダー読み込み時にやってるとめんどい&忘れる(忘れてもコンパイルエラー起きるだけだけど)。解決策としては、
- 忘れないように努力する。
- C++/CLIのプロジェクトを分離して、Thrustを使う側は
/clr
を切ってネイティブでコンパイルする。ただしC++/CLI側のプロジェクトで呼び出すヘッダー側には依然として忘れないように前後に入れておかないと同じ事になる。 - thrustを読み込むだけの
thrust_include.hpp
とか使って、その前後に入れておく。 - thrustのgitレポジトリをフォークして自分で直接書き換える。
上から順に挿入量が少なくなっていく分、最初の手間が増えます、たぶん。もっとスマートな解決方法ないかなぁ・・・。