为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
Why does my templated function require a conversion from one iterator to the other?
我正在尝试实现一个二叉搜索树容器。目前,我必须实现一个能够返回迭代器或常量迭代器的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_MyIterator
到MyIterator
的转换。
您需要使x
成为与const
版本的end()
返回的内容相匹配的const_MyIterator
。
您还应该使tree_search()
返回一个const_MyIterator
,而不是返回一个非常量iterator
。 如果您希望tree_search()
返回一个非常量Iterator
,则不要将其声明为const
方法。
相关文章:
- 不明白迭代器,引用和指针失效,一个例子
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 我可以将迭代器递增一个整数吗?
- 使用一个 for 循环如何迭代和测试迭代器值?
- 测试迭代器是否位于列表中的最后一个
- 转到基于范围的 for 循环中的下一个迭代器
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- C++ 为 costum 类创建一个 const 迭代器
- 有没有一个迭代器的例子,它不会使用 ptrdiff_t 作为其difference_type?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 使用迭代器进行合并排序中的一个缓冲区
- 对于C字符串,是否有一个标准的C++迭代器
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- 迭代器或反向器的一个变量
- C++链表最后一个元素的迭代器?
- 为什么此函数返回一个link_type但它被声明为迭代器
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- 每个花哨的指针都应该是一个迭代器吗?