MPLのエラーはややこしい

id:faith_and_braveさんのsub_windowを自分の環境でコンパイルしてみた。

1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>  main.cpp
1>c:\boost\boost_1_44_0\boost\range\iterator.hpp(63): error C2039: 'type' : 'boost::mpl::eval_if_c' のメンバーではありません。
1>          with
1>          [
1>              C=false,
1>              F1=boost::range_const_iterator>,
1>              F2=boost::range_mutable_iterator
1>          ]
1>          c:\pstade_1_04_3\pstade\oven\range_iterator.hpp(35) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::range_iterator' の参照を確認してください
1>          with
1>          [
1>              C=boost::mpl::_
1>          ]
1>          c:\pstade_1_04_3\pstade\oven\range_difference.hpp(24) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::oven::range_iterator' の参照を確認してください
1>          with
1>          [
1>              Range=boost::mpl::_
1>          ]
1>          c:\pstade_1_04_3\pstade\oven\window.hpp(36) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::oven::range_difference' の参照を確認してください
1>          with
1>          [
1>              Range=boost::mpl::_
1>          ]
1>          c:\boost\boost_1_44_0\boost\type_traits\is_convertible.hpp(263) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::oven::window_detail::base' の参照を確認してください
1>          with
1>          [
1>              Range=boost::mpl::_
1>          ]
1>          c:\boost\boost_1_44_0\boost\type_traits\is_convertible.hpp(295) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::detail::is_convertible_basic_impl' の参照を確認してください
1>          with
1>          [
1>              From=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range> &,
1>              To=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>
1>          ]
1>          c:\boost\boost_1_44_0\boost\type_traits\is_convertible.hpp(372) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::detail::is_convertible_impl' の参照を確認してください
1>          with
1>          [
1>              From=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,
1>              To=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>
1>          ]
1>          c:\boost\boost_1_44_0\boost\type_traits\is_convertible.hpp(418) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::detail::is_convertible_impl_dispatch' の参照を確認してください
1>          with
1>          [
1>              From=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,
1>              To=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>
1>          ]
1>          c:\pstade_1_04_3\pstade\is_convertible.hpp(31) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::is_convertible' の参照を確認してください
1>          with
1>          [
1>              From=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,
1>              To=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>
1>          ]
1>          c:\boost\boost_1_44_0\boost\utility\enable_if.hpp(36) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::is_convertible' の参照を確認してください
1>          with
1>          [
1>              From=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,
1>              To=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>
1>          ]
1>          c:\pstade_1_04_3\pstade\enable_if.hpp(41) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::enable_if' の参照を確認してください
1>          with
1>          [
1>              Cond=pstade::is_convertible>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>>,
1>              T=pstade::enabler 
1>          ]
1>          c:\pstade_1_04_3\pstade\egg\detail\little_pipable_result.hpp(103) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::enable_if' の参照を確認してください
1>          with
1>          [
1>              Cond=pstade::is_convertible>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>>,
1>              T=pstade::enabler
1>          ]
1>          d:\work\software\test\cpp\test\test\main.cpp(23) : コンパイルされたクラスの テンプレート のインスタンス化 'const pstade::oven::iter_range pstade::egg::detail::little_pipable_resultns_::operator |,Reference,Value>>,Base,Strategy,boost::tuples::tuple>(const A &,const pstade::egg::function &)' の参照を確認してください
1>          with
1>          [
1>              Iterator=pstade::oven::detail::transform_iterator>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>>,pstade::oven::detail::transform_iterator,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>,const pstade::oven::iter_range,pstade::oven::iter_range>,
1>              UnaryFun=pstade::oven::rows_detail::to_row,__w64 int>,
1>              Incrementable=int,
1>              CategoryOrTraversal=boost::use_default,
1>              Difference=boost::use_default,
1>              Reference=const pstade::oven::iter_range,
1>              Value=pstade::oven::iter_range,
1>              Base=pstade::oven::T_make_transformed,
1>              Strategy=pstade::egg::by_perfect,
1>              T0=const boost::lambda::lambda_functor>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>> &,
1>              A=pstade::oven::iter_range,__w64 int>,boost::counting_iterator,const pstade::oven::iter_range,pstade::oven::iter_range>>,
1>              Little=pstade::egg::detail::little_pipable_resultns_::little_pipable_result>,boost::tuples::tuple>,pstade::egg::by_perfect>,const boost::lambda::lambda_functor>,const unsigned int,const unsigned int,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type,boost::lambda::detail::bind_traits::type>>> &>>
1>          ]
1>          d:\work\software\test\cpp\test\test\main.cpp(52) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::oven::any_range sub_window>(const Range &,size_t,size_t,size_t,size_t,size_t,size_t)' の参照を確認してください
1>          with
1>          [
1>              Reference=int,
1>              Traversal=boost::forward_traversal_tag,
1>              Value=boost::use_default,
1>              Difference=boost::use_default,
1>              T=int,
1>              N=25,
1>              Range=boost::array
1>          ]
1>c:\pstade_1_04_3\pstade\oven\range_difference.hpp(25): error C3203: 'type' : 非特殊クラス テンプレート は、テンプレート 引数として テンプレート パラメーター 'Iterator' に使用できません。実際の型を指定してください
1>c:\pstade_1_04_3\pstade\oven\range_difference.hpp(25): error C2955: 'boost::type' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
1>          c:\boost\boost_1_44_0\boost\type.hpp(14) : 'boost::type' の宣言を確認してください。
1>c:\pstade_1_04_3\pstade\oven\range_difference.hpp(26): error C2955: 'boost::iterator_difference' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
1>          c:\boost\boost_1_44_0\boost\iterator\iterator_traits.hpp(48) : 'boost::iterator_difference' の宣言を確認してください。
1>c:\pstade_1_04_3\pstade\oven\window.hpp(44): error C3203: 'type' : 非特殊クラス テンプレート は、テンプレート 引数として テンプレート パラメーター 'Iterator' に使用できません。実際の型を指定してください
1>c:\pstade_1_04_3\pstade\oven\window.hpp(44): error C2955: 'boost::type' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
1>          c: \boost\boost_1_44_0\boost\type.hpp(14) : 'boost::type' の宣言を確認してください。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

\(^o^)/


3時間ぐらいデバッグしたんだけど原因というかなんでそうなってるのかが分からない…。
うーん、難しいなぁー。
まぁこういうのをデバッグしてると中身を見るので色々と勉強になるんだけどね。


[追記]
こちらからp-stadeライブラリの最新のリビジョンを落としてくれば動くようになります。
GCCの場合ではライブラリを落としてこなくても、このパッチを適用すれば動くようになります。