【问题标题】:Why does my templated function require a conversion from one iterator to the other?为什么我的模板化函数需要从一个迭代器到另一个迭代器的转换?
【发布时间】: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


【解决方案1】:

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

没有。

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

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

您需要将x 设为const_MyIterator 以匹配end()const 版本返回的内容。

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

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2012-10-23
    • 2023-03-17
    • 2010-10-09
    • 2016-08-01
    相关资源
    最近更新 更多