C++ boost::绑定don';使用成员模板函数编译
我只写了一个简单的例子来测试boost::bind。我用它来实例化一个模板成员函数,但它不会用g++4.6.0编译。我不知道有什么问题。 代码如下:C++ boost::绑定don';使用成员模板函数编译,c++,C++,我只写了一个简单的例子来测试boost::bind。我用它来实例化一个模板成员函数,但它不会用g++4.6.0编译。我不知道有什么问题。 代码如下: #include <boost/bind.hpp> struct Functor { void operator()() { } }; struct DerivedFinishAction { DerivedFinishAction() {} void Inc() { } template
#include <boost/bind.hpp>
struct Functor
{
void operator()()
{
}
};
struct DerivedFinishAction
{
DerivedFinishAction()
{}
void Inc()
{
}
template <typename T>
void TmplFunc(T t)
{
(boost::bind(&DerivedFinishAction::BindFunc<T>, this , t))();
}
template <typename T>
void BindFunc(T t)
{
t();
}
void Func()
{
Functor f;
TmplFunc(f); // this is OK
TmplFunc(boost::bind(&DerivedFinishAction::Inc, this)); // compile error
}
};
int main(int argc, char *argv[])
{
return 0;
}
#包括
结构函子
{
void运算符()()
{
}
};
结构派生的FinishAction
{
DerivedFinishAction()
{}
void公司()
{
}
模板
无效TmplFunc(T)
{
(boost::bind(&DerivedFinishAction::BindFunc,this,t))();
}
模板
void BindFunc(T)
{
t();
}
void Func()
{
函子f;
TmplFunc(f);//这没关系
TmplFunc(boost::bind(&DerivedFinishAction::Inc,this));//编译错误
}
};
int main(int argc,char*argv[])
{
返回0;
}
g++给出了以下错误:
In file included from /usr/include/boost/bind.hpp:22:0,
from testBind.cpp:1:
/usr/include/boost/bind/bind.hpp: In member function ‘void boost::_bi::list2<A1, A2>::operator()(boost::_bi::type<void>, F&, A&, int) [with F = boost::_mfi::mf1<void, DerivedFinishAction, boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > > >, A = boost::_bi::list0, A1 = boost::_bi::value<DerivedFinishAction*>, A2 = boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > >]’:
/usr/include/boost/bind/bind_template.hpp:20:59: instantiated from ‘boost::_bi::bind_t<R, F, L>::result_type boost::_bi::bind_t<R, F, L>::operator()() [with R = void, F = boost::_mfi::mf1<void, DerivedFinishAction, boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > > >, L = boost::_bi::list2<boost::_bi::value<DerivedFinishAction*>, boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > > >, boost::_bi::bind_t<R, F, L>::result_type = void]’
testBind.cpp:24:5: instantiated from ‘void DerivedFinishAction::TmplFunc(T) [with T = boost::_bi::bind_t<void, boost::_mfi::mf0<void, DerivedFinishAction>, boost::_bi::list1<boost::_bi::value<DerivedFinishAction*> > >]’
testBind.cpp:37:58: instantiated from here
/usr/include/boost/bind/bind.hpp:313:9: error: invalid use of void expression
在/usr/include/boost/bind.hpp:22:0中包含的文件中,
来自testBind.cpp:1:
/usr/include/boost/bind/bind.hpp:在成员函数“void boost::_bi::list2::operator()(boost::_bi::type,F&,A&,int)[带F=boost:_mfi::mf1,A=boost:_bi::list0,A1=boost:_bi::value,A2=boost:_bi::bind_t]:
/usr/include/boost/bind/bind_template.hpp:20:59:实例化自“boost::\u bi::bind\u t::result_type boost:::\u bi::bind\u t::operator()[带R=void,F=boost::\u mfi::mf1,L=boost::\u bi::list2,boost:\u bi::bind\u t::result\u type=void]”
testBind.cpp:24:5:从“void-DerivedFinishAction::TmplFunc(T)[with T=boost::\u-bi::bind\u-T]实例化”
testBind.cpp:37:58:从此处实例化
/usr/include/boost/bind/bind.hpp:313:9:错误:无效使用void表达式
有人能解释一下吗?为什么第一个实例化可以,而第二个实例化会导致编译错误?这里涉及到boost::bind
的一个(不明显)特性
如果你写:
void func1(int len) {return len+1;};
int func2(std::string str) {return str.length();};
assert(
boost::bind(func1, boost::bind(func2, _1) )("Hello")
== 6 );
boost::bind
假设您的意思是对运行func2
“Hello”
,然后对结果运行func1
。这允许更有趣的部分函数应用
在您的程序中,有一个表达式相当于:
boost::bind(&DerivedFinishAction::BindFunc<...>,
this,
boost::bind(&DerivedFinishAction::Inc, this))
编辑:根据文档,您可以使用保护
实现所需的行为:
#include <boost/bind/protect.hpp>
...
TmplFunc(boost::protect(boost::bind(&DerivedFinishedAction::Inc, this))); // no longer an error
...
#包括
...
TmplFunc(boost::protect(boost::bind(&DerivedFinishedAction::Inc,this));//不再是错误
...
@SethCarnegie,15分钟,仅此而已,boost::bind
的此功能也适用于std::bind
。解决方案很棒。谢谢@Managu
#include <boost/bind/protect.hpp>
...
TmplFunc(boost::protect(boost::bind(&DerivedFinishedAction::Inc, this))); // no longer an error
...