我有以下代码错误:
(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;
}
这段代码出了什么问题?
答案 0 :(得分:3)
Iterator
的类型为node_wrap<Node>
,因此*first
会在此处返回Node
:
while ( first != last && *first != c )
没有!=
运算符,可将其与c
的类型进行比较,即int
。你可能意味着:
while ( first != last && first->val != c )
我建议使用另一种定义operator==
和operator!=
的方法,将Node
与int
进行比较,因为这些方法根本不同,不应该相互比较。
答案 1 :(得分:2)
您正在尝试将Node
与int
进行比较(执行find2
时,这在功能*first != c
中完成)。
虽然您提供operator==
用于比较Node
和int
,但您尚未提供operator!=
来执行相同操作。如果你添加一个,这应该可行。