コンパイル時にsyntax errorが出る問題は解決した。
大量のエラーでげっそりしていたのだけれど、丹念にエラーを追っかけていくことにして、まずはエラーコードから見ていくことにした。
H:\libs\boost\include\boost-1_52\boost/utility/value_init.hpp(107) : error C2061: syntax error : identifier 'wrapper_address' (toplevel_window.cpp)
C2061というエラーは予期しない位置で識別子が使われたときに出るエラーである。つまりwrapper_addressという識別子の位置がおかしいとコンパイラは言っている。そしてそれはvalue_init.hpp(107)であるということだ。なのでvalue_init.hppの107行目を見てみると、
wrapper * wrapper_address() const
{
return static_cast<wrapper *>( static_cast<void*>(&x));
}
public :
initialized()
{
#if BOOST_DETAIL_VALUE_INIT_WORKAROUND
std::memset(&x, 0, sizeof(x));
#endif
new (wrapper_address()) wrapper();// 107行目
}
配置newが使われており、wrapper_addressはwrapper* を返す関数である。見た感じ何も問題なさそうだ。
しかし私はVCのデバッグ支援機能を使っていて、こんな定義を.cppファイルにいつも盲目的に追加している。
#if _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
この定義が先にあると上の配置newは下記のように展開される。
new(_NORMAL_BLOCK, __FILE__, __LINE__)(wrapper_address()) wrapper();// 107行目
なのでsyntax errorになるわけだ。そりゃなりますわな。。解決方法は今のところ、デバッグ支援機能用のコードを挿入する位置をインクルードファイルのあとに入れることで回避している。
これでようやく先に進めるようになった。