【发布时间】:2020-04-21 11:25:07
【问题描述】:
我有一个包含std::vector 的类,另一个是该类的自定义iterator。它适用于非常量方法,但是当我尝试在const 方法中创建iterator 时,编译器会失败,因为它无法将const_iterator 转换为iterator。例如,下面的代码失败了,但是如果对ConstFunc的调用被注释掉了,它编译并运行良好。
#include <vector>
template <class T>
class FooIter {
public:
typename std::vector<T>::iterator iterator;
FooIter(std::vector<T> &vec) {iterator = vec.begin();}
};
template <class T>
class Foo {
public:
std::vector<T> vec;
Foo() {}
void NonConstFunc() {
FooIter<T> iter(vec);
}
void ConstFunc() const {
FooIter<T> iter(vec);
}
};
int main()
{
Foo<int> foo;
foo.NonConstFunc();
foo.ConstFunc();
return 0;
}
有没有办法修改FooIter,使其可以同时用作iterator 和const_iterator?
编辑:一位评论者问“您打算如何在 const 方法中使用 FooIter<T>?”下面是一个例子。
std::vector< std::pair<unsigned, unsigned> > find() const {
std::vector< std::pair<unsigned, unsigned> > list(0);
Matrix2dIterator<T> it = this->begin(true);
Matrix2dIterator<T> itEnd = this->end(true);
for (; it != itEnd; ++it) {
if (*it) {
list.push_back(std::make_pair(it.getRow(), it.getCol()));
}
}
return list;
}
Matrix2d 是“Foo”,Matrix2dIterator 是“FooIter”。 find 需要遍历保存矩阵数据的 std::vector,但它不会更改该数据。
【问题讨论】:
-
您可能需要
FooIter和ConstFooIter,因为iterator和const_iterator是不同的类型。你可以用union/variant做一些奇怪的事情,但这会让你的代码难以阅读。 -
根据我的经验,尝试使
iterator和const_iterator类型相同是行不通的。 -
您打算如何在
const方法中使用FooIter<T>? -
您可以尝试使用
FooIter类的一些额外模板参数化,但通常只为 iterator 和 const_iterator 设置两个单独的类型会更容易。 -
@rustyx 我添加了一个示例,说明我打算如何在问题中使用 const_iterator。
标签: c++ oop templates iterator