我有一个名为 的类A
,在这个类中我有一个可迭代的容器,我通过遵循一些访问规则进行迭代——顺序、空虚和其他。
为了简化下面的示例,让我们考虑一下我只是在遍历容器,但这不能使用内置容器的 iterator来完成。
class A {
public:
class iterator {
public:
// Constructor
iterator() {
}
// Destructor
~iterator() {
}
// Advances the iterator
void operator++() {
// Some accessing policy
}
};
private:
std::vector<int> a;
};
一切都非常好——而且看起来很整洁——除了,当我声明我的迭代器时,我必须使用typename
——我几乎假设它是用来告诉编译器我拥有的是一个类型,而不是类实例本身。
问题:
为什么我必须使用
typename
:A a; for (typename A::iterator it(...); it != ...; ++it) { }
迭代器通常如何定义,因为向量迭代器不需要
typename
标签?它是否与从类定义中声明向量而不是从向量本身有关?std::vector<int> v; for (std::vector<int>::iterator it(v.begin()); it != v.end(); ++it) { }
是否在容器类中定义了迭代器——我猜它被命名为组合——或者,如果没有,它是如何将迭代器添加到类的命名空间中的,例如:
std::vector<int>::iterator it;