我有一个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>() ); }
注意:此功能与“增加”功能不同,后者是一个仿函数。
以下是我测试程序的方法:
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.
然后我删除&#34;&amp;&#34;在这里使用VST访问,这次它可以工作,但我仍然有一个很大的问题,我不知道为什么我不能使用VST&amp;作为遍历函数的变量访问。
通过引用传递给我看起来很好。
答案 0 :(得分:0)
在遍历函数中按值VST
取值。目前,您传递的r值对象只能被const-reference
(const T&amp;)或r-value reference
(T&amp;&amp;)[它成为模板的通用引用]接受。
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
答案 1 :(得分:0)
您的问题是您尝试将临时Increase<T>()
作为非const引用参数传递。 C ++只允许temporaries绑定到const引用参数(或r值引用参数)。
解决方案是按值传递,或声明Increase<T>
局部变量并将其传递给V.traverse()
。