首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

std:bind2nd函数为什么不能绑定普通C函数?解决方法

2012-04-17 
std::bind2nd函数为什么不能绑定普通C函数?发现bind2nd似乎只能绑定std的functor,而不能绑定普通的C函数,

std::bind2nd函数为什么不能绑定普通C函数?
发现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 1000bool 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'


1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(327): 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(329): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(329): error C2039: 'second_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(329): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(329): error C2039: 'second_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(329): error C2143: syntax error : missing ',' before '&'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(347): error C2825: '_Fn2': must be a class or namespace when followed by '::'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(347): error C2039: 'second_argument_type' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(347): error C2146: syntax error : missing ';' before identifier 'value'
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional(347): fatal error C1903: unable to recover from previous error(s); stopping compilation
1>
1>Build FAILED.


[解决办法]
改成这样试试

C/C++ code
#include<cstdlib>#include<vector>#include<functional>#include<algorithm>#include<iostream>#include<ctime>using namespace std;#define N 1000bool cmp(const int i1,const int i2){return i1>i2;}int main(){ srand(time(nullptr)); int nRand[N]; for_each(nRand,nRand+N,[=](int& i){i=rand();}); vector<int> v(N); copy(nRand,nRand+N,v.begin()); auto c=count_if(v.begin(),v.end(),bind2nd(ptr_fun(cmp),2)); return 0;} 

热点排行