Я пытаюсь реализовать контейнер двоичного дерева поиска. На данный момент я должен реализовать функцию 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);
}
Теперь конец Функция () перегружена, чтобы получить как 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 () в соответствии с типом итератора, который он должен создать?