为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?

Why does my templated function require a conversion from one iterator to the other?

本文关键字:迭代器 一个 转换 另一个 我的 函数 为什么      更新时间:2023-10-16

我正在尝试实现一个二叉搜索树容器。目前,我必须实现一个能够返回迭代器或常量迭代器的find((函数。我选择重载查找功能以适应这两种可能性

MyIterator<treepair> find(const key& x)
{
return tree_search<MyIterator<treepair>>(root,x);   
}
const_MyIterator<treepair> find(const key& x) const
{
return tree_search<const_MyIterator<treepair>>(root,x); 
}

然后,该函数tree_search通过生成树来递归查找包含所需键的节点:

template<typename iterator>
iterator tree_search(Node<treepair>* x, const key& y) const
{
if(x == nullptr)
{
std::cout<<"element not found"<<std::endl;
iterator x = end();//HERE I HAVE A PROBLEM
return x;
}
else if (y == x->value.first)
{
iterator i{x,tree_maximum()};
std::cout<<"element found"<<std::endl;
return i;
}
if(y < x->value.first) 
return tree_search<iterator>(x->left,y);
else return tree_search<iterator>(x->right,y);
}

现在 end(( 函数被重载以同时提供const_iterator和常规迭代器:

MyIterator<treepair> end(){
return MyIterator<treepair>{nullptr,tree_maximum()};
}
const_MyIterator<treepair> end() const{
return const_MyIterator<treepair>{nullptr,tree_maximum()};
}

但是我收到此错误

test_on_iterators.cc:508:12: error: conversion from ‘const_MyIterator<std::pair<int, int> >’ to non-scalar type ‘MyIterator<std::pair<int, int> >’ requested
iterator x = end();

此错误是由于类型之间的转换要求造成的吗?编译器不是应该根据它必须生成的迭代器类型来选择想要的 end(( 函数吗?

编译器

不是应该根据它必须生成的迭代器类型来选择想要的 end(( 函数吗?

不。

tree_search()是一种const方法。 这意味着它的this指针指向一个const对象(即使调用tree_search()的对象并不是真正const(。

因此,当tree_search()内部调用end()时,它会调用const对象上可调用的重载。 该重载返回一个const_MyIterator。 然后tree_search()尝试将该const_MyIterator分配给一个非常量MyIterator,这是您得到错误的地方,因为没有定义从const_MyIteratorMyIterator的转换。

您需要使x成为与const版本的end()返回的内容相匹配的const_MyIterator

您还应该使tree_search()返回一个const_MyIterator,而不是返回一个非常量iterator。 如果您希望tree_search()返回一个非常量Iterator,则不要将其声明为const方法。