Boost.MultiArrayでresize()やview()がコンパイルできない件
1つ前の記事(と言っても11ヶ月前のですがw)の解決方法です.
いえ,解決自体はもっと前にしてたのですがメモをしていなかったので.
参考:
compiler bug in msvc10 with std::copy
_HAS_ITERATOR_DEBUGGING | Microsoft Docs
これによると,MSVC2010のstd::copyはInputIteratorにinput_iterator_tagかつOutputIteratorにoutput_iterator_tag,又は両方ともrandom_access_iterator_tagのどちらかの組合せを要求しているのだそうです.
それに適合しないstd::copyの使い方をしているためコンパイルエラーになっているようです.
そしてそのチェックはITERATOR DEBUG LEVELの値によって行なわれます.
つまり,そのチェックを無効にすれば良いわけです.
#define _HAS_ITERATOR_DEBUGGING 0
これをboostヘッダをインクルードする前に定義すれば大丈夫です.
ただし,翻訳単位毎にこのITERATOR DEBUG LEVELが違うとリンクエラーが発生します.
そしてやっかいな事に,Boostのライブラリファイルも同じでなければなりません.
そのため,利用するプロジェクト及びBoostをITERATOR DEBUG LEVELが0の状態でビルドしなければならないのです.
Boostは以下の様にすれば良いです.
bjam define=_HAS_ITERATOR_DEBUGGING=0 ...
MSVCのプロジェクトはプロジェクトのプロパティからC/C++プリプロセッサ全体に定義すれば良いと思います.
と,書いておいて何ですが,この方法はあまりよろしくないですよね.
良い方法はないでしょうか….