为什么不能运算符!=进行转换?

Why can't operator!= do the conversion?

本文关键字:转换 不能 运算符 为什么      更新时间:2023-10-16

我有以下代码出现错误:

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

这段代码有什么问题?

Iterator

的类型是node_wrap<Node>,所以*first在这里返回一个Node

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

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

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

我建议使用这种方法来定义operator==operator!=,将Nodeint进行比较,因为它们是根本不同的类型,不应该相互比较。

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

虽然您提供了将Nodeint进行比较的operator==,但您尚未提供执行相同操作的operator!=。如果你添加一个,这应该有效。