繁体   English   中英

仿函数在c ++中不起作用

[英]functor doesn't work in c++

我有一个Vector类(不是内置的)。 我想写一个内置函数,我可以遍历Vector类。 vector类以这种方式定义:

template <typename T> class Vector{int _size; int _capicity ; T* _elem;
   /(protected and public functions/};

然后我写一个公共函数遍历:

template <typename T> template <typename VST> 
void Vector<T>::traverse ( VST& visit ) 
{ for ( int i = 0; i < _size; i++ ) visit ( _elem[i] ); }
//visit here represent some action that I am gonna perform on the elements

测试代码:我编写了一个函数来对vector类的每个元素执行_elem [i] ++。

template <typename T>
struct Increase 
  {virtual void operator() ( T& e ) { e++; }  }; 

在主程序中,我写了一个函数:

template <typename T>
void increase ( Vector<T> & V )
 {  V.traverse ( Increase<T>() );  } 

注意:此函数与Increase函数不同,后者是一个仿函数。

以下是我测试程序的方法:

 Vector<int> c={1,2,3,4,5}; //initialize my vector class
 increase(c);

它返回错误消息:

 no match function for call to 'traverse'.

我发现它可能与我声明遍历的方式有关。

void Vector<T>::traverse ( VST& visit );
V.traverse ( Increase<T>() );//this is the way I called this function.

然后我在这里删除“&”并使用VST访问,这次它可以工作,但我仍然有一个很大的问题,我不知道为什么我不能使用VST和访问作为遍历函数的变量。

我通过引用传递似乎很好。

在遍历功能中按值取VST 目前,您传递的r值对象只能由const-reference (const T&)或r-value reference (T &&)[它成为模板的通用引用]接受。

template <typename T> 
template <typename VST> 
void Vector<T>::traverse ( VST visit ) 
{ 
   for ( int i = 0; i < _size; i++ ) visit ( _elem[i] ); 
}

要使其按引用工作,首先要创建一个仿函数的l-value实例,然后调用traverse

template <typename T>
void increase ( Vector<T> & V )
{  
   Increase<T> inc;
   V.traverse ( inc );  
} 

但如果可以的话,更愿意通过价值来传递它。 STL按值获取仿函数。 另外,你也不应该使用const-reference ,因为那样你也必须使你的operator() const

您的问题是您尝试将临时的Increase<T>()作为非const引用参数传递。 C ++只允许temporaries绑定到const引用参数(或r值引用参数)。

解决方案是按值传递,或者声明一个Increase<T>局部变量并将其传递给V.traverse()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM