仿函数在 C++ 中不起作用
functor doesn't work in c++
我有一个 Vector class(不是内置的)。我想编写一个可以遍历 Vector class 的内置函数。
向量 class 是这样定义的:
template <typename T> class Vector{int _size; int _capicity ; T* _elem;
/(protected and public functions/};
然后我写一个public函数遍历:
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
测试代码:
我写了一个仿函数来对向量 class.
的每个元素执行 _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);
它returns错误信息:
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 visit,这次可以了,但我还有一个大问题,我不知道为什么我不能使用VST& visit作为遍历函数的变量.
我参考一下就好了
在遍历函数中取值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>()
作为非常量引用参数。 C++ 只允许临时对象绑定到 const 引用参数(或右值引用参数)。
解决方案要么按值传递,要么声明一个 Increase<T>
局部变量并将其传递给 V.traverse()
。
我有一个 Vector class(不是内置的)。我想编写一个可以遍历 Vector class 的内置函数。 向量 class 是这样定义的:
template <typename T> class Vector{int _size; int _capicity ; T* _elem;
/(protected and public functions/};
然后我写一个public函数遍历:
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
测试代码: 我写了一个仿函数来对向量 class.
的每个元素执行 _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);
它returns错误信息:
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 visit,这次可以了,但我还有一个大问题,我不知道为什么我不能使用VST& visit作为遍历函数的变量.
我参考一下就好了
在遍历函数中取值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>()
作为非常量引用参数。 C++ 只允许临时对象绑定到 const 引用参数(或右值引用参数)。
解决方案要么按值传递,要么声明一个 Increase<T>
局部变量并将其传递给 V.traverse()
。