という名前のクラスが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;