Почему моя шаблонная функция требует преобразования одного итератора в другой? - PullRequest
1 голос
/ 13 февраля 2020

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

1 Ответ

0 голосов
/ 14 февраля 2020

Разве компилятор не должен выбирать требуемую функцию end () в соответствии с типом итератора, который он должен создать?

Нет.

tree_search() это const метод. Это означает, что указатель this указывает на объект const (даже если объект, на который вызывается tree_search(), на самом деле не const).

Таким образом, когда tree_search() внутренне вызывает end(), он вызывает перегрузку, которая вызывается для const объекта. Эта перегрузка возвращает const_MyIterator. Затем tree_search() пытается присвоить это const_MyIterator неконстантному MyIterator, в котором вы получаете ошибку, поскольку не определено преобразование из const_MyIterator в MyIterator.

. Вам нужно чтобы x было const_MyIterator в соответствии с тем, что возвращает const версия end().

Вы также должны заставить tree_search() возвращать const_MyIterator вместо того, чтобы возвращать не -конст iterator. Если вы хотите, чтобы tree_search() возвращал неконстантный Iterator, не объявляйте его как const метод.

...