为什么不能运营商!=做转换?

时间:2012-11-01 18:07:33

标签: c++

我有以下代码错误:

  

(Visual Studio错误:)错误5错误C2678:二进制'!=':找不到哪个运算符带有''Node'类型的左手操作数(或者没有可接受的转换)

  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;
    }

这段代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

Iterator的类型为node_wrap<Node>,因此*first会在此处返回Node

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

没有!=运算符,可将其与c的类型进行比较,即int。你可能意味着:

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

我建议使用另一种定义operator==operator!=的方法,将Nodeint进行比较,因为这些方法根本不同,不应该相互比较。

答案 1 :(得分:2)

您正在尝试将Nodeint进行比较(执行find2时,这在功能*first != c中完成)。

虽然您提供operator==用于比较Nodeint,但您尚未提供operator!=来执行相同操作。如果你添加一个,这应该可行。