1

我是模板新手,作为练习,我试图在一个文件中编写自己的模板迭代器,然后在另一个文件中使用该迭代器来查找算法。

例如在 myfind.h 我有

#ifndef my_find_header
#define  my_find_header

template <typename T, typename TIter>
inline
TIter * find (TIter * start , TIter * stop ,  const T & value)  
{     
    while ((start != stop ) && (*start != value))
    {
        start++;
    }
    return start;
}
#endif

在 arr_it.h 我有

#include <stdlib.h>

#ifndef arr_it_header 
#define arr_it_header 

template <typename T>
class arr_it
{
  public:
    arr_it(T *p);

    T & operator * () const;
    arr_it operator++ (int);
    bool operator != (const arr_it<T> & other) const;
  private:
    T * my_p;
};


//start of definitions
template <typename T>
inline
arr_it<T>:: arr_it(T *p)       
{
    my_p = p;
}


template <typename T>
inline
T & arr_it<T>::operator * () const 
{        
    return *my_p;                
}
template <typename T>
inline
arr_it<T> arr_it<T>::operator++ (int)
{
    arr_it<T> result(*this);
    my_p++;
    return result;
}

template <typename T>
inline
bool arr_it<T>::operator != (const arr_it<T> &     other)             const
    {
        return (my_p != other.my_p);
    }

    #endif

我在我的 main.cpp 中调用它

#include <iostream>
#include <stdlib.h>
#include "builtin_arr_it.h"
#include "myfind.h"


int main()
{
    int my_array[10];
    for (int i =0; i<100; i++)
    {
        my_array[i]=1;
    }

my_array[47]= -1; 
    my_array[4]= -1;   
    const int value(-1);

    arr_it <int> start (my_array);
    arr_it <int> stop  (my_array +10);


    arr_it<int> p = (find (start, stop, value)); 
return 0;
}

但是,我收到以下错误

error: no matching function for call to 'find(array_it<int>&, array_it<int>&, const     int&)'

使用 g++ 编译时;

所以我的问题是,我如何包含文件(或类似的东西),这将允许一个文件的模板访问/识别另一个文件的模板。

顺便说一句,我不确定标题是否正确地抓住了这个问题。随意更改标题的名称

谢谢。

4

2 回答 2

2

看起来你有一些多余的指针,试试

template <typename T, typename TIter>
inline
TIter find (TIter start , TIter stop ,  const T & value)
{
    // ...
}

作为您的功能的签名。(注意缺少*的 s)

此外,正如 DyP 所指出的,您可能想要*start != value而不是*start == value.

于 2013-10-01T19:16:10.323 回答
1

您正在传递对find函数的引用,但它是用指向迭代器的指针定义的。更改定义

TIter& find (TIter& start , TIter& stop ,  const T & value)  

并且不要取消引用正文中的迭代器。

于 2013-10-01T19:17:05.657 回答