2010-04-12 30 views
2

我有一个Visual Studio 2008的C++应用程序,确实是这样的:的boost ::绑定,这已经是必然

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; 
} 

*到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>  ] 

如果有人能指出我可能做错了,我将不胜感激。


编辑: 通过更改为:

boost::bind(Bar<Fcn>, fcn); 

通过大家的建议,我只剩下1个错误:

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>  ] 

感谢, PaulH

+1

也许编译器不能找出'void main()'的东西。 – avakar 2010-04-12 20:47:45

回答

5

你需要指定模板参数。

boost::bind(Bar<Fcn>, fcn)(); 

编辑:此外,人们必须使用boost ::保护,以防止从FCN得到评估。请参阅Paul对正确用法的评论。

+0

谢谢!只是一个错误去。不能将参数1从'int'转换为'boost :: _ bi :: bind_t PaulH 2010-04-12 21:06:44

+2

你非常接近。我以前从来没有听说过boost :: protect,但是我把它搞砸了。我需要的是'Foo(boost :: protect(boost :: bind(:: GetSystemPowerStatusEx,&status,true)));' – PaulH 2010-04-12 21:47:03

+1

是的,它没有很好的记录。起初,我尝试使用boost :: bind(条形码,boost :: ref(fcn))();来解决评估问题。我很快搜索了boost :: bind中是否有解决方案,并在邮件列表中找到了一篇文章(http://lists.boost.org/boost-users/2004/11/8412.php)。但是,正如你已经知道的那样,这也不是正确的答案。 – kloffy 2010-04-12 22:19:14

3

问题是Bar不是一个函数。然而,Bar<Fcn>是。尝试

boost::bind(Bar<Fcn>, fcn)(); 
1

尝试 的boost ::绑定(酒吧< FCN>,FCN)();

相关问题