I have a C++ class where I'm trying to use std::bind1st to bind a member function to the 'this' parameter. For example:
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()
{
};
};
When I add that last 'bind1st' line, I get the following compiler errors:
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> ]
I am using STLPort v5.2.1 for a standard library implementation.
Ordinarily, I would switch to boost::bind and use that. Unfortunately, that is not a possibility for this application.
What can I do to get the functionality I'm looking for?
Thanks, PaulH
Edit:
To be more clear, I'm looking for a way to adapt a unary function to whatever you call a function that takes no parameters. I want to 'bind' this
to MyClass::Bar
.
class SomeOtherClass
{
public:
template< typename Fcn >
void ExecuteFcn( Fcn fcn )
{
fcn();
};
};
some_other_class.ExecuteFcn( bind1st( mem_fun( &MyClass::Bar ), this );
bind
. You can create a simple wrapper to do this, like I mentioned in my answer, but otherwise I don't think the standard library has any other built-in way to do it. – Haver