【发布时间】:2020-05-29 13:22:01
【问题描述】:
我正在尝试实现一个二叉搜索树容器。目前我必须实现一个能够返回迭代器或常量迭代器的 find() 函数。我选择重载 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() 函数吗?
【问题讨论】:
标签: c++ c++11 iterator const-iterator