私の理解では、typedef は型のシノニムとして機能するか、特定の型のエイリアスとして使用できます。また、以下の単純化されたコードは完全に構築されています。ここでの質問は、メイン関数の 2 行目を次のように変更した場合です。
Array<int>::ArrayIter<T> pa = a.begin(); // substituting back the typedef “iterator” to its original form of ArrayIter<T>.
コンパイル中に次のエラー メッセージが表示されます。
「ArrayIter」は「Array」のメンバーではありません</p>
しかし、コードは「typedef」(反復子) 表記を使用して完全にコンパイルされました。「イテレータ」と ArrayIter が突然同義ではなくなったのはなぜですか。
以下の参照コード:
template<class T> class ArrayIter {
public:
ArrayIter(T* p) : m_p(p) {
}
private:
T* m_p;
};
template<class T> class Array {
public:
Array(int size) throw (const char*) {
if ( size > 0 ) {
m_p = new T[size];
m_size = size;
} else {
throw "Array: invalid array dimension";
}
}
// typedef and methods to support the new iterator for this class
typedef ArrayIter<T> iterator;
ArrayIter<T> begin() {
return ArrayIter<T>(m_p);
}
private:
T* m_p;
int m_size;
};
int main(int argc, char* argv[]) {
Array<int> a(10);
Array<int>::iterator pa = a.begin();
return 0;
}