【发布时间】:2013-09-04 21:09:46
【问题描述】:
我有一个 C++ 类,我正在尝试使用 std::bind1st 将成员函数绑定到“this”参数。例如:
class MyClass
{
public:
void Foo()
{
using namespace std;
// this works fine
this->Bar();
// this also works fine
mem_fun( &MyClass::Bar )( this );
// this does not
bind1st( mem_fun( &MyClass::Bar ), this )();
// this is not a possibility for this program
boost::bind( &MyClass::Bar, this )();
};
void Bar()
{
};
};
当我添加最后的 'bind1st' 行时,我收到以下编译器错误:
1>stl/_function.h(189) : error C2039: 'second_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1> with
1> [
1> _Ret=void,
1> _Tp=MyClass
1> ]
1> .\MyClass.cpp(50) : see reference to class template instantiation 'stlp_std::binder1st<_Operation>' being compiled
1> with
1> [
1> _Operation=stlp_std::mem_fun_t<void,MyClass>
1> ]
1>stl/_function.h(189) : error C2146: syntax error : missing ',' before identifier 'second_argument_type'
1>stl/_function.h(189) : error C2065: 'second_argument_type' : undeclared identifier
1>stl/_function.h(190) : error C2955: 'stlp_std::unary_function' : use of class template requires template argument list
1> stl/_function_base.h(40) : see declaration of 'stlp_std::unary_function'
1>stl/_function.h(191) : error C2039: 'second_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1> with
1> [
1> _Ret=void,
1> _Tp=MyClass
1> ]
1>stl/_function.h(191) : error C2146: syntax error : missing ',' before identifier 'second_argument_type'
1>stl/_function.h(191) : error C2065: 'second_argument_type' : undeclared identifier
1>stl/_function.h(194) : error C2955: 'stlp_std::unary_function' : use of class template requires template argument list
1> stl/_function_base.h(40) : see declaration of 'stlp_std::unary_function'
1>stl/_function.h(195) : error C2955: 'stlp_std::unary_function' : use of class template requires template argument list
1> stl/_function_base.h(40) : see declaration of 'stlp_std::unary_function'
1>stl/_function.h(197) : error C2146: syntax error : missing ';' before identifier '_ArgParamType'
1>stl/_function.h(197) : error C3254: 'stlp_std::binder1st<_Operation>' : class contains explicit override 'param_type' but does not derive from an interface that contains the function declaration
1> with
1> [
1> _Operation=stlp_std::mem_fun_t<void,MyClass>
1> ]
1>stl/_function.h(197) : error C2838: 'param_type' : illegal qualified name in member declaration
1>stl/_function.h(197) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(197) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(198) : error C2146: syntax error : missing ';' before identifier '_ConstArgParamType'
1>stl/_function.h(198) : error C3254: 'stlp_std::binder1st<_Operation>' : class contains explicit override 'const_param_type' but does not derive from an interface that contains the function declaration
1> with
1> [
1> _Operation=stlp_std::mem_fun_t<void,MyClass>
1> ]
1>stl/_function.h(198) : error C2838: 'const_param_type' : illegal qualified name in member declaration
1>stl/_function.h(198) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(198) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(199) : error C2039: 'first_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1> with
1> [
1> _Ret=void,
1> _Tp=MyClass
1> ]
1>stl/_function.h(199) : error C2146: syntax error : missing ',' before identifier 'first_argument_type'
1>stl/_function.h(199) : error C2065: 'first_argument_type' : undeclared identifier
1>stl/_function.h(199) : error C2955: 'stlp_std::__call_traits' : use of class template requires template argument list
1> stl/type_traits.h(452) : see declaration of 'stlp_std::__call_traits'
1>stl/_function.h(203) : error C2039: 'first_argument_type' : is not a member of 'stlp_std::mem_fun_t<_Ret,_Tp>'
1> with
1> [
1> _Ret=void,
1> _Tp=MyClass
1> ]
1>stl/_function.h(203) : error C2146: syntax error : missing ';' before identifier '_M_value'
1>stl/_function.h(203) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(203) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>stl/_function.h(208) : error C2061: syntax error : identifier '_ConstArgParamType'
1>stl/_function.h(211) : error C2061: syntax error : identifier '_ArgParamType'
1>stl/_function.h(212) : error C2535: '_Result stlp_std::binder1st<_Operation>::operator ()(void) const' : member function already defined or declared
1> with
1> [
1> _Operation=stlp_std::mem_fun_t<void,MyClass>
1> ]
1> stl/_function.h(208) : see declaration of 'stlp_std::binder1st<_Operation>::operator ()'
1> with
1> [
1> _Operation=stlp_std::mem_fun_t<void,MyClass>
1> ]
我正在使用 STLPort v5.2.1 实现标准库。
通常,我会切换到 boost::bind 并使用它。不幸的是,这个应用程序不可能做到这一点。
我可以做些什么来获得我正在寻找的功能?
谢谢, 保罗H
编辑:
更清楚地说,我正在寻找一种方法来使一元函数适应您调用的不带参数的函数。我想将this“绑定”到MyClass::Bar。
class SomeOtherClass
{
public:
template< typename Fcn >
void ExecuteFcn( Fcn fcn )
{
fcn();
};
};
some_other_class.ExecuteFcn( bind1st( mem_fun( &MyClass::Bar ), this );
【问题讨论】:
-
是的,我不相信不使用
bind就可以做到这一点。您可以创建一个简单的包装器来执行此操作,就像我在回答中提到的那样,但除此之外,我认为标准库没有任何其他内置方法可以做到这一点。