boost::lambda と VS2005の accumulate

ようやくインストールが終わったのかしら〜…相変わらず Visual Studio はセットアップに時間がかかるのぅ…。 まぁ、.NET Frameworks 2.0 とかインストールしなきゃならんわけですから、仕方ないですけどね。



さて、VS2005 が入ったということは! 薔薇乙女メールチェッカーを x64 ビルドしてみるのかしらーーー!!!

F7をぽちっとな。



?:\DxSDK\Include\strsafe.h(5595) : warning C4996: '_vsnprintf' が古い形式として宣言されました。
        E:\VStudio2005\VC\include\stdio.h(339) : '_vsnprintf' の宣言を確認してください。
        メッセージ: 'This function or variable may be unsafe. Consider using _vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
?:\DxSDK\Include\strsafe.h(5635) : warning C4996: '_vsnwprintf' が古い形式として宣言されました。
        E:\VStudio2005\VC\include\wchar.h(719) : '_vsnwprintf' の宣言を確認してください。
        メッセージ: 'This function or variable may be unsafe. Consider using _vsnwprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
?:\DxSDK\Include\strsafe.h(5719) : warning C4996: '_vsnprintf' が古い形式として宣言されました。
        E:\VStudio2005\VC\include\stdio.h(339) : '_vsnprintf' の宣言を確認してください。
        メッセージ: 'This function or variable may be unsafe. Consider using _vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

orz


…とまぁ、VS2003未満から乗り換えた人は、文字列操作系の「古い関数だよ警告ストリーム!」に遭遇するというのは通らなくてはいけない道だと思っているので、これはこれで良いのですが……って、Microsoft側のライブラリである strsafe.h で怒られてねこれ!? …ははははは……ま、まぁ良いとしよう…*1


でまぁ、警告の嵐はでまくったのですが、基本的にはコードを特に修正せずビルドが通りそうです。 …が、ひとつだけちょっと謎なビルドエラーが。


struct SHoge
{
  size_t m_nReceiveMailCount;
};

return std::accumulate(m_stlFieldList.begin(), m_stlFieldList.end(), size_t(),
    bll::_1 + bll::bind(&SHoge::m_nReceiveMailCount, bll::_2));

このコードをビルドすると


numeric(43) : error C2440: '=' : 'boost::lambda::detail::return_type_deduction_failure<<unnamed-symbol>>' から 'size_t' に変換できません。
        with
        [
            <unnamed-symbol>=boost::lambda::detail::return_type_2_arithmetic_phase_3<unsigned __int64,unsigned __int64>
        ]
        この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。
        numeric(52) : コンパイルされたクラスの テンプレート のインスタンス化 '_Ty std::_Accumulate<std::_Vector_iterator<SMailCheckResultField,_Alloc>,_Ty,_Fn2>(_InIt,_InIt,_Ty,_Fn2)' の参照を確認してください
        with
        [
            _Ty=size_t,
            _Alloc=std::allocator<SMailCheckResultField>,
            _Fn2=boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2,boost::lambda::function_action<2>>,boost::tuples::tuple<unsigned __int64 SMailCheckResultField::* const ,const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type>>>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>>,
            _InIt=std::_Vector_iterator<SMailCheckResultField,std::allocator<SMailCheckResultField>>
        ]
        .\CMailCheckResult.cpp(50) : コンパイルされたクラスの テンプレート のインスタンス化 '_Ty std::accumulate<std::_Vector_iterator<SMailCheckResultField,_Alloc>,size_t,boost::lambda::lambda_functor<T>>(_InIt,_InIt,_Ty,_Fn2)' の参照を確認してください
        with
        [
            _Ty=size_t,
            _Alloc=std::allocator<SMailCheckResultField>,
            T=boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2,boost::lambda::function_action<2>>,boost::tuples::tuple<unsigned __int64 SMailCheckResultField::* const ,const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type>>>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,
            _InIt=std::_Vector_iterator<SMailCheckResultField,std::allocator<SMailCheckResultField>>,
            _Fn2=boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2,boost::lambda::function_action<2>>,boost::tuples::tuple<unsigned __int64 SMailCheckResultField::* const ,const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type>>>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>>
        ]

return_type_deduction_failure<<unnamed-symbol>> なんていわれている以上、戻り値の型の推論(というの?)が失敗しているワケですが…う〜ん。 VS2003 じゃ何事も無くビルドできたし、VS2005 x86 ビルドも問題なく通るんだけどなぁ。



ちなみにこの問題の解決方法は、下記のように明示的に戻り値の型を教えてあげることにより問題解決します。


return std::accumulate(m_stlFieldList.begin(), m_stlFieldList.end(), size_t(),
    bll::ret<size_t>(bll::_1 + bll::bind(&SMailCheckResultField::m_nReceiveMailCount, bll::_2)));

致命的な問題ではないとはいえ、ちょっと気になるところ。64bit コンパイラの size_t には何かあるのかしら〜……

*1:つか、DirectX のヘッダーなんて #include してないと思ったんだけどなぁ…見直しておこう。