std:bind2nd函数为什么不能绑定普通C函数?解决方法
std::bind2nd函数为什么不能绑定普通C函数?
发现bind2nd似乎只能绑定std的functor,而不能绑定普通的C函数,下面这段代码编译的时候会出一堆错误。VC10
为什么呢?
1>ClCompile:
1> console1.cpp
1>console1.cpp(12): warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1> console1.cpp(17) : see reference to class template instantiation 'std::binder2nd<_Fn2>' being compiled
1> with
1> [
1> _Fn2=bool (int &,int &)
1> ]
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2039: 'first_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2146: syntax error : missing ',' before identifier 'first_argument_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2065: 'first_argument_type' : undeclared identifier
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2039: 'result_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2146: syntax error : missing ',' before identifier 'result_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2065: 'result_type' : undeclared identifier
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(322): error C2955: 'std::unary_function' : use of class template requires template argument list
1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstddef(135) : see declaration of 'std::unary_function'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2039: 'first_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2146: syntax error : missing ',' before identifier 'first_argument_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2065: 'first_argument_type' : undeclared identifier
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(325): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(325): error C2039: 'result_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(325): error C2146: syntax error : missing ',' before identifier 'result_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(326): error C2955: 'std::unary_function' : use of class template requires template argument list
1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstddef(135) : see declaration of 'std::unary_function'
发现bind2nd似乎只能绑定std的functor,而不能绑定普通的C函数,下面这段代码编译的时候会出一堆错误。VC10
为什么呢?
- C/C++ code
#include<cstdlib> #include<vector> #include<functional> #include<algorithm> #include<iostream> #include<ctime> using namespace std; #define N 1000 bool cmp(int& i1,int& i2){return i1>i2;} void main(){ srand(time(nullptr)); int nRand[N]; for_each(nRand,nRand+N,[=](int& i){i=rand();}); vector<string> v(N); copy(nRand,nRand+N,v.begin()); auto c=count_if(v.begin(),v.end(),bind2nd(cmp,2)); //auto c=count_if(v.begin(),v.end(),bind2nd(greater<int>(),2));这样就没有错误 }
1>ClCompile:
1> console1.cpp
1>console1.cpp(12): warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1> console1.cpp(17) : see reference to class template instantiation 'std::binder2nd<_Fn2>' being compiled
1> with
1> [
1> _Fn2=bool (int &,int &)
1> ]
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2039: 'first_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2146: syntax error : missing ',' before identifier 'first_argument_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(320): error C2065: 'first_argument_type' : undeclared identifier
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2039: 'result_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2146: syntax error : missing ',' before identifier 'result_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(321): error C2065: 'result_type' : undeclared identifier
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(322): error C2955: 'std::unary_function' : use of class template requires template argument list
1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstddef(135) : see declaration of 'std::unary_function'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2039: 'first_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2146: syntax error : missing ',' before identifier 'first_argument_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(324): error C2065: 'first_argument_type' : undeclared identifier
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(325): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(325): error C2039: 'result_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(325): error C2146: syntax error : missing ',' before identifier 'result_type'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(326): error C2955: 'std::unary_function' : use of class template requires template argument list
1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstddef(135) : see declaration of 'std::unary_function'