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++プリプロセッサ全体に定義すれば良いと思います.


と,書いておいて何ですが,この方法はあまりよろしくないですよね.
良い方法はないでしょうか….