Pau*_*ulH 2 c++ boost boost-bind
我有一个Visual Studio 2008 C++应用程序,它执行以下操作:
template< typename Fcn >
inline void Bar( Fcn fcn ) // line 84
{
fcn();
};
template< typename Fcn >
inline void Foo( Fcn fcn )
{
// this works fine
Bar( fcn );
// this fails to compile
boost::bind( Bar, fcn )();
};
int main()
{
SYSTEM_POWER_STATUS_EX status = { 0 };
Foo( boost::bind( ::GetSystemPowerStatusEx, &status, true ) ); // line 160
return 0;
}
Run Code Online (Sandbox Code Playgroud)
*对GetSystemPowerStatusEx()的调用仅用于演示.在那里插入您最喜欢的电话,行为是一样的.
当我编译这个时,我得到84个错误.除非被问到,否则我不会发布所有内容,但他们从这开始:
1>.\MyApp.cpp(99) : error C2896: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : cannot use function template 'void Bar(Fcn)' as a function argument
1> .\MyApp.cpp(84) : see declaration of 'Bar'
1> .\MyApp.cpp(160) : see reference to function template instantiation 'void Foo<boost::_bi::bind_t<R,F,L>>(Fcn)' being compiled
1> with
1> [
1> R=BOOL,
1> F=BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),
1> L=boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>,
1> Fcn=boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>
1> ]
Run Code Online (Sandbox Code Playgroud)
如果有人能够指出我可能做错了什么,我将不胜感激.
编辑:通过更改为:
boost::bind( Bar< Fcn >, fcn );
Run Code Online (Sandbox Code Playgroud)
按照大家的建议,我有一个错误:
1>boost/bind/bind.hpp(246) : error C2664: 'void (Fcn)' : cannot convert parameter 1 from 'int' to 'boost::_bi::bind_t<R,F,L>'
1> with
1> [
1> Fcn=boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>
1> ]
1> and
1> [
1> R=BOOL,
1> F=BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),
1> L=boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>
1> ]
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1> boost/bind/bind_template.hpp(20) : see reference to function template instantiation 'void boost::_bi::list1<A1>::operator ()<void(__cdecl *)(Fcn),boost::_bi::list0>(boost::_bi::type<T>,F &,A &,int)' being compiled
1> with
1> [
1> A1=boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>,
1> Fcn=boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>,
1> T=void,
1> F=void (__cdecl *)(boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>),
1> A=boost::_bi::list0
1> ]
1> boost/bind/bind_template.hpp(18) : while compiling class template member function 'void boost::_bi::bind_t<R,F,L>::operator ()(void)'
1> with
1> [
1> R=void,
1> F=void (__cdecl *)(boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>),
1> L=boost::_bi::list1<boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>>
1> ]
1> .\MyApp.cpp(99) : see reference to class template instantiation 'boost::_bi::bind_t<R,F,L>' being compiled
1> with
1> [
1> R=void,
1> F=void (__cdecl *)(boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>),
1> L=boost::_bi::list1<boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>>
1> ]
1> .\MyApp.cpp(160) : see reference to function template instantiation 'void Foo<boost::_bi::bind_t<R,F,L>>(Fcn)' being compiled
1> with
1> [
1> R=BOOL,
1> F=BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),
1> L=boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>,
1> Fcn=boost::_bi::bind_t<BOOL,BOOL (__cdecl *)(PSYSTEM_POWER_STATUS_EX,BOOL),boost::_bi::list2<boost::_bi::value<_SYSTEM_POWER_STATUS_EX *>,boost::_bi::value<bool>>>
1> ]
Run Code Online (Sandbox Code Playgroud)
谢谢,PaulH
您需要指定模板参数.
boost::bind( Bar<Fcn>, fcn )();
Run Code Online (Sandbox Code Playgroud)
编辑:此外,必须使用boost :: protect来防止fcn被评估.请参阅Paul对正确用法的评论.
归档时间: |
|
查看次数: |
1875 次 |
最近记录: |