如何使用两个函数,一个返回迭代器,另一个返回const_iterator
How to use two functions, one returning iterator, the other returning const_iterator
我有一个叫做find的函数,它有两个版本:
template <typename T>
typename btree<T>::iterator btree<T>::find(const T& elem)
{
//Implementation
}
,另一个是const_iterator版本:
template <typename T>
typename btree<T>::const_iterator btree<T>::find(const T& elem) const
{
//Implementation
}
在我的测试文件中当我执行
btree<char>::iterator it = myTree.find('M');
一切正常,但是当我使用const_iterator版本时:
btree<char>::const_iterator it = myTree.find('M');
显示错误
错误:请求从'btree_iterator'转换为'const_btree_iterator'非标量类型
这显然意味着find只使用迭代器(非const
)版本。我知道c++应该自动调用const_iterator
版本——如果我做得对的话。问题是,我可能做错了什么?
迭代器类是:
class btree_iterator
和class const_btree_iterator
,这只是btree_iterator
的复制粘贴,名称改变了
以下是完整的源代码:
btree_iterator.h(包含const_btree_iterator) http://pastebin.com/zQnj9DxA
btree.h http://pastebin.com/9U5AXmtV
来。tem http://pastebin.com/U9uV3uXj
所有标准容器都实现了从非const迭代器到const迭代器的转换(在容器概念的要求中指定):
用于遍历容器元素的迭代器类型。迭代器的值类型应该是容器的值类型。必须存在从迭代器类型到const迭代器类型的转换。
需要这样的转换构造函数:
class btree_iterator;
class const_btree_iterator
{
// ....
public:
const_btree_iterator(const btree_iterator& rhs) { /* .... */ }
//optionally: const_btree_iterator& operator=(const btree_iterator& rhs) { /* .... */ }
};
我也加入了赋值操作符,但我认为它是多余的
这里重要的一点是,重载解析只基于函数的参数而不是结果来执行。在你的特殊情况下,你有两个不同的重载,不同之处在于隐式this
在其中一个中是常量,当调用方法的对象或引用的静态类型是常量时,重载将被拾取。
如果要强制对常量重载进行分派,可以获取一个const引用,然后调用该引用:
btree<char> const & r = myTree;
btree<char>::const_iterator it = r.find('M');
您应该在实际代码中避免这种结构,即使您将其用于测试目的。原因是const和非const重载应该具有相同的语义,因此行为应该相同。
还需要注意的是,在标准容器中,有一个从iterator
到const iterator
的隐式转换,以支持直接在非const容器上使用const_iterator
。您应该做同样的事情,也就是说,如果您提供从iterator
到const_iterator
的隐式转换,那么您可以只写:
btree<char>::const_iterator it = myTree.find('M');
…它将工作(将不测试find
方法,但将允许您验证const_iterator
行为)
- 不能将方法返回的值用于另一个方法
- 如何在另一个函数中使用返回值作为参数?
- 如何在 C 中包装C++具有参数的类方法或返回另一个C++类的实例?
- 在返回另一个函数的函数中执行程序期间出错
- 如何通过指向返回另一个函数的函数的指针调用具有默认参数的函数
- QVector<int>[index] 返回另一个 QVector?
- GetWindowText 返回另一个进程的空字符串
- 接受元组并返回另一个元组的功能
- 如何阻止线程,直到函数返回另一个线程
- 过滤函数中的矢量,并返回另一个带有过滤结果的矢量
- c++:返回另一个类的函数中的对象
- c++中的template函数希望返回另一个容器
- RegQueryValueEx返回另一个寄存器的值的奇怪行为
- c++ lambda:返回另一个返回另一个函数的函数
- Boost Lambda/Phoenix-如何处理返回另一个Lambda的Lambda
- 两个C++类的方法返回另一个
- 如何让getter返回另一个对象的指针
- 函数返回另一个函数
- 如何实例化一个类的对象来生成并返回另一个类的对象
- 通过单个函数返回另一个函数的多个参数