0

我有以下错误代码:

(Visual Studio 错误:)错误 5 错误 C2678: 二进制 '!=' : 未找到采用“节点”类型的左操作数的运算符(或没有可接受的转换)

  template <class C, class T>
    C find2 ( C first , C last, T c )
    {
        //
        while ( first != last && *first != c )
        {
            ++first;
        }

        return first;
    }

    struct Node
    {
        Node(int a ,Node* b):val(a),next(b){};
        int val;
        Node* next;
    };

    template <class T>
    struct node_wrap
    {
        T* ptr;

        node_wrap ( T* p = 0 ) : 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 Node& node, int n )
    {
        return node.val == n;
    }


    int main()
    {

        Node* node1=new Node(3,NULL);
        Node* node2=new Node(4,NULL);
        node1->next = node2;
        find2 ( node_wrap<Node>(node1), node_wrap<Node>(), 3) ) ;
        delete node1;
        delete node2;
        return 0;
    }

这段代码有什么问题?

4

2 回答 2

3

Iterator是 type node_wrap<Node>,所以在这里*first返回 a Node

    while ( first != last && *first != c )

它没有!=将其与 的类型进行比较的运算符,cint. 你可能的意思是:

    while ( first != last && first->val != c )

我会推荐这种方法,而不是另一种定义operator==operator!=比较Node的方法int,因为它们是根本不同的类型,不应该相互比较。

于 2012-11-01T18:14:14.123 回答
2

您正在尝试将 aNode与 an进行比较int(这是在执行时在函数中find2完成的*first != c)。

虽然您提供了一个operator==用于比较 aNode和 an 的方法int,但您还没有提供 anoperator!=来做同样的事情。如果您添加一个,这应该可以工作。

于 2012-11-01T18:16:00.347 回答