std :: find不想使用自己的类包装器

时间:2013-11-06 16:00:17

标签: c++ iterator

#include <iostream>
#include <algorithm>
using namespace std;

template<class Iterator, class T>
Iterator find_my(Iterator first, Iterator last, const T& v)
{
while(first!=last && *first!=v)
    ++first;
return first;
}

struct int_node 
{
int val;
int_node* next;
};

template<class Node>
struct node_wrap
{
Node* ptr;
node_wrap(Node* p = NULL) : ptr(p) { }

Node& operator*() const { return *ptr; }
Node* operator->() const { return ptr; }

node_wrap& operator++() { ptr = ptr->next; return *this; }
node_wrap& operator++(int) { node_wrap tmp = *this; ++this; return tmp; }

bool operator==(const node_wrap& i) const { return ptr == i.ptr; }
bool operator!=(const node_wrap& i) const { return ptr != i.ptr; }
};

bool operator==(const int_node& node, int n)
{
return node.val == n;
}

bool operator!=(const int_node& node, int n)
{
return node.val != n;
 }

int main()
{
int_node* nod[10];
for(int i = 0; i<10; i++)
{
    int b,j;
    j=i;
    cout << "\nEnter number: ";
    cin >> b;
    nod[i] = new int_node;
    nod[i]->val = b;
    if(i==0)
        nod[i]->next = NULL;
    else
        nod[i]->next = nod[--j];
}

int a;
cout << "\nWhich number do you find: ";
cin >> a;
node_wrap<int_node> first(nod[9]);


node_wrap<int_node> search = find_my(first,node_wrap<int_node>(), a);


if(search != node_wrap<int_node>())
    cout << "\nAll is good: " << a;
cout << "\nIf not good, then Bad";
cout <<  endl;
system("pause");
return 0;
}

我做了我的Iterator,它为int_node类型调用了“struct node_wrap”。问题是标准函数查找从不想使用此迭代器(node_wrap)。但是使用我自己的函数find_my()它运行良好。我做错了什么?谢谢。

编译器发出很多错误。例如:

error C2868: 'std::iterator_traits<_Iter>::difference_type' : 
illegal syntax for using-      declaration;
expected qualified-name
1>          with
1>          [
1>              _Iter=node_wrap<int_node>
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(368): 
error C2039: 'pointer' : is not a member of 'node_wrap<Node>'
1>          with
1>          [
1>              Node=int_node
1>          ]

1 个答案:

答案 0 :(得分:2)

std::find需要有关您的类型的更多信息才能正常工作。特别是,std::iterator_traits需要与迭代器一起使用:

template<class Node>
struct node_wrap
{
    typedef void difference_type; // you should use another difference type
    typedef Node value_type;
    typedef Node* pointer;
    typedef Node& reference;
    typedef std::forward_iterator_tag  iterator_category;

    // ...
};