过载(c)开始/(c)结束
Overloading (c)begin/(c)end
我试图为一个类重载(c)begin
/(c)end
函数,以便能够调用基于C++11范围的for循环。
它在大多数情况下都有效,但我无法理解和解决一个问题:
for (auto const& point : fProjectData->getPoints()){ ... }
此行返回错误:
Error C2662: 'MyCollection<T>::begin' : cannot convert 'this' pointer from 'const MyCollection' to 'MyCollection<T> &'
因为CCD_ 3是指向常量的指针。如果我把它设为非常量,它确实有效。考虑到cbegin()
&将CCD_ 5精确地展开为CCD_;CCD_ 7起作用。
以下是我在MyCollection:中开发的函数(在头文件中(
/// returns the begin iterator
typename std::list<T>::iterator begin() {
return objects.begin();
}
/// returns the begin const iterator
typename std::list<T>::const_iterator cbegin() const {
return objects.cbegin();
}
/// returns the end iterator
typename std::list<T>::iterator end() {
return objects.end();
}
/// returns the end const iterator
typename std::list<T>::const_iterator cend() const {
return objects.cend();
}
有什么想法吗?
基于范围的for循环(对于类类型范围(查找begin
和end
函数。完全不考虑cbegin
和cend
:
§6.5.4【标准范围】/p1*:
[…]
如果
_RangeT
是类类型,则在类_RangeT
的作用域中查找非限定idbegin
和end
,就像通过类成员访问查找一样(3.4.5(,并且如果其中一个(或两个(找到至少一个声明,则开始expr和结束expr分别是__range.begin()
和__range.end()
;否则,begin expr和end expr分别为
begin(__range)
和end(__range)
,其中begin
和end
在相关命名空间中查找(3.4.2(
对于const
限定的范围,相关的成员函数也必须是const
限定的(或者,如果使用了后一个选项,则应该可以用const
限定的实例调用(。你需要引入额外的过载:
typename std::list<T>::iterator begin() {
return objects.begin();
}
typename std::list<T>::const_iterator begin() const {
// ~~~~^
return objects.begin();
}
typename std::list<T>::const_iterator cbegin() const {
return begin();
}
typename std::list<T>::iterator end() {
return objects.end();
}
typename std::list<T>::const_iterator end() const {
// ~~~~^
return objects.end();
}
typename std::list<T>::const_iterator cend() const {
return end();
}
演示
*措辞来自C++14,但差异与问题无关,正如所述
相关文章:
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何显示函数开始、结束行和函数体?
- C++ 从具有开始位置和结束位置的列表中删除
- C++程序从主程序开始执行并在主程序结束?
- 如何使用Chrono或ctime libaray输入设置的开始和结束时间
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 编写一个函数,在开始和结束处添加括号,使所有括号匹配并返回
- 如何通过指定开始值、结束值和步骤来生成值序列
- 如何获取由 new 创建的数组的开始和结束
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- 重写自定义数组类的运算符/开始/结束
- f流删除特定的开始到结束行
- 取代表开始/结束的数字对,并删除重叠
- 如何将迭代器(包括结束和开始之前的迭代器)测试到列表或forward_list保持有效
- 设置从文件中读取的开始和结束限制
- 为什么 std::variant 使用开始和结束迭代器进行编译?
- 如何为一个类提供多个开始/结束代理
- 如何有效地从C++集中删除开始和结束元素
- 加权图的开始和结束的最短路径