У меня есть класс с именем A
, и в этом классе у меня есть итерируемый контейнер, который я повторяю, следуя некоторым правилам доступа — порядок, пустота и другие.
Чтобы упростить следующий пример, давайте представим, что я просто просматриваю контейнер, но это невозможно сделать с помощью встроенного итератора контейнера.
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;
a::iterator
вместоA::iterator
? - person lucasmrod   schedule 09.03.2013