vc6自带的stl中的mem_fun_ref这个adapter似乎有问题,有人注意到了吗?

时间:2022-09-07 12:05:48
我在发现它不能用于有一个参数的成员函数。
我查找了vc6的stl源码,发现其中有一个mem_fun1_ref,从源代码来看似乎很有可能适用于一个参数的成员函数。但编译的时候,vc6无法正确地推断出成员函数的类型。
大家在使用stl的algorithm库时发现过这个问题吗?是我理解错误还是vc6的stl或者编译器有问题?

8 个解决方案

#1


vc6不是通常要打sp6吗?打了否?要不用vc7.1呀.

#2


VC6的STL比较烂

#3


sp6是打了,可是好像没什么作用。

#4


好像mem_fun1_ref也是不行的

#5


msdn的用法是这样的
// functional_mem_fun_ref.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

using namespace std;

class NumVals
   {
   int val;
   public:
   NumVals ( ) { val = 0; }
   NumVals ( int j ) { val = j; }

   bool display ( ) { cout << val << " "; return true; }
   bool isEven ( ) { return ( bool )  !( val %2 ); }
   bool isPrime ( ) 
   {
      for ( int i = 2;  i <= ( val / 2 ); i++ )
         if ( !( val % i ) ) return false;
      return true;
   }
};

int main( )
{
   vector <NumVals> v1 ( 13 ), v2 ( 13 );
   vector <NumVals>::iterator v1_Iter, v2_Iter;
   int i, k;

   for ( i = 0; i < 13; i++ ) v1 [ i ] = NumVals ( i+1 );
   for ( k = 0; k < 13; k++ ) v2 [ k ] = NumVals ( k+1 );

   cout << "The original values stored in v1 are: " ;
   for_each( v1.begin( ), v1.end( ), 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;

   // Use of mem_fun_ref calling member function through a reference
   // remove the primes in the vector using isPrime ( )
   v1_Iter = remove_if ( v1.begin( ),  v1.end( ), 
      mem_fun_ref ( &NumVals::isPrime ) );   
   cout << "With the primes removed, the remaining values in v1 are: " ;
   for_each( v1.begin( ), v1_Iter, 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;

   cout << "The original values stored in v2 are: " ;
   for_each( v2.begin( ), v2.end( ), 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;

   // Use of mem_fun_ref calling member function through a reference
   // remove the even numbers in the vector v2 using isEven ( )
   v2_Iter = remove_if ( v2.begin( ),  v2.end( ), 
      mem_fun_ref ( &NumVals::isEven ) );   
   cout << "With the even numbers removed, the remaining values are: " ;
   for_each( v2.begin( ),  v2_Iter, 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;
}


可以编译通过.

#6


不好意思,我搞错了.
换用mem_fun1_ref是这样用的

#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

using namespace std;

class NumVals
   {
   int val;
   public:
   NumVals ( ) { val = 0; }
   NumVals ( int j ) { val = j; }

   bool test(int i){printf("test be call");return true;}
  
};
template<class FUNC> 
void testFunc(FUNC func,NumVals val,int arg)
{func(val,arg); }
int main( )
{
int i=10;
testFunc(mem_fun1_ref(&NumVals::test),10,i);  

   cout << endl;
}

#7


bind1st 和 mem_fun1/mem_fun1_ref 都不能并用

vc 没有解决 reference to reference is invalid 的问题

#8


恩,原来我也碰到过这个问题,后来听说是没有打sp6的原因

#1


vc6不是通常要打sp6吗?打了否?要不用vc7.1呀.

#2


VC6的STL比较烂

#3


sp6是打了,可是好像没什么作用。

#4


好像mem_fun1_ref也是不行的

#5


msdn的用法是这样的
// functional_mem_fun_ref.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

using namespace std;

class NumVals
   {
   int val;
   public:
   NumVals ( ) { val = 0; }
   NumVals ( int j ) { val = j; }

   bool display ( ) { cout << val << " "; return true; }
   bool isEven ( ) { return ( bool )  !( val %2 ); }
   bool isPrime ( ) 
   {
      for ( int i = 2;  i <= ( val / 2 ); i++ )
         if ( !( val % i ) ) return false;
      return true;
   }
};

int main( )
{
   vector <NumVals> v1 ( 13 ), v2 ( 13 );
   vector <NumVals>::iterator v1_Iter, v2_Iter;
   int i, k;

   for ( i = 0; i < 13; i++ ) v1 [ i ] = NumVals ( i+1 );
   for ( k = 0; k < 13; k++ ) v2 [ k ] = NumVals ( k+1 );

   cout << "The original values stored in v1 are: " ;
   for_each( v1.begin( ), v1.end( ), 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;

   // Use of mem_fun_ref calling member function through a reference
   // remove the primes in the vector using isPrime ( )
   v1_Iter = remove_if ( v1.begin( ),  v1.end( ), 
      mem_fun_ref ( &NumVals::isPrime ) );   
   cout << "With the primes removed, the remaining values in v1 are: " ;
   for_each( v1.begin( ), v1_Iter, 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;

   cout << "The original values stored in v2 are: " ;
   for_each( v2.begin( ), v2.end( ), 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;

   // Use of mem_fun_ref calling member function through a reference
   // remove the even numbers in the vector v2 using isEven ( )
   v2_Iter = remove_if ( v2.begin( ),  v2.end( ), 
      mem_fun_ref ( &NumVals::isEven ) );   
   cout << "With the even numbers removed, the remaining values are: " ;
   for_each( v2.begin( ),  v2_Iter, 
   mem_fun_ref ( &NumVals::display ) );
   cout << endl;
}


可以编译通过.

#6


不好意思,我搞错了.
换用mem_fun1_ref是这样用的

#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

using namespace std;

class NumVals
   {
   int val;
   public:
   NumVals ( ) { val = 0; }
   NumVals ( int j ) { val = j; }

   bool test(int i){printf("test be call");return true;}
  
};
template<class FUNC> 
void testFunc(FUNC func,NumVals val,int arg)
{func(val,arg); }
int main( )
{
int i=10;
testFunc(mem_fun1_ref(&NumVals::test),10,i);  

   cout << endl;
}

#7


bind1st 和 mem_fun1/mem_fun1_ref 都不能并用

vc 没有解决 reference to reference is invalid 的问题

#8


恩,原来我也碰到过这个问题,后来听说是没有打sp6的原因