我有线性代数的类,特别是向量和矩阵。这些包含std :: vectors(或std :: maps)作为其“数据”字段。
在基于for循环的范围内迭代这些很容易。但是我想让这些字段变得私有,并且使我的自定义类的迭代更加自然,这样我就可以在类本身上进行基于范围的循环。
我试着查看std :: vector<> .begin()等函数的定义。然后我尝试以这样的方式实现它,即所有迭代器对象都是从std :: vector<>转发的。领域,但无济于事。当我尝试迭代我的类的常量实例时,使用以下示例;
int main() {
AlgebraLib::Vector A(4, true);
A[0] = 4;
A[1] = 5;
A[2] = 6;
A[3] = 7;
for (auto &&item : A) {
std::cout << item << std::endl;
}
const AlgebraLib::Vector B = A;
for (auto &&item : B) {
std::cout << item << std::endl;
}
return EXIT_SUCCESS;
}
...我收到以下编译错误;
error: passing ‘const AlgebraLib::Vector’ as ‘this’ argument discards qualifiers [-fpermissive]
for (auto &&item : B) {
基本上,所有迭代器都是这样定义的:
std::vector<double>::iterator Vector::begin() {
return _VectorContents.begin();
}
std::vector<double>::iterator Vector::end() {
return _VectorContents.end();
}
std::vector<double>::reverse_iterator Vector::rbegin() {
return _VectorContents.rbegin();
}
std::vector<double>::reverse_iterator Vector::rend() {
return _VectorContents.rend();
}
std::vector<double>::const_iterator Vector::cbegin() const noexcept{
return _VectorContents.cbegin();
}
std::vector<double>::const_iterator Vector::cend() const noexcept{
return _VectorContents.cend();
}
std::vector<double>::const_reverse_iterator Vector::crbegin() const noexcept{
return _VectorContents.crbegin();
}
std::vector<double>::const_reverse_iterator Vector::crend() const noexcept{
return _VectorContents.crend();
}
在我的标题Vector.hpp中:
// Iterators
std::vector<double>::iterator begin();
std::vector<double>::iterator end();
std::vector<double>::reverse_iterator rbegin();
std::vector<double>::reverse_iterator rend();
std::vector<double>::const_iterator cbegin() const noexcept;
std::vector<double>::const_iterator cend() const noexcept;
std::vector<double>::const_reverse_iterator crbegin() const noexcept;
std::vector<double>::const_reverse_iterator crend() const noexcept;
我觉得我在这里错过了一些东西?我对C ++比较陌生,现在我用C ++ 11工作。
答案 0 :(得分:1)
问题是B
是const
,但是range-for循环只使用begin
和end
(不是cbegin
和{{1} })并且您的cend
和begin
函数没有end
的重载。这是一个问题,因为只能在const
个对象上调用标记为const
的函数。
解决方案很简单:只需添加此类重载
const
这些重载的实现与非const函数的实现相同。