ダメだこりゃ
iteratorの勉強をしようと思って、Standard Template Library プログラミング on the Webを参考にしつつ、とりあえず自分でiterator(ぽいもの)を作ってみた。struct iterator<>をpublicに継承して…、ってこんな感じで書いてたんだけど(比較/2項演算子のオーバーロードは省略)、
class iterator : public std::iterator<std::random_access_iterator_tag, T> { value_type * data; public: // コンストラクタ iterator() : data(){} iterator(const iterator & rhs) : data(rhs.data){} // 代入演算子 iterator & operator=(const iterator & rhs) { if(rhs != *this) data = rhs.data; return *this; } // 参照 value_type & operator*(){ return *data; } value_type & operator[](const difference_type diff) // difference_typeなんて知らないと怒られる { if(diff < num) return m_char[diff]; else throw "exception"; } // 演算 iterator & operator++(){ ++data; return *this; } iterator operator++(int){ data++; return *this; } iterator & operator+=(difference_type diff) // 同上 { data += diff; return data; } iterator & operator--(){ ++data; return *this; } iterator operator--(int){ data++; return *this; } iterator & operator-=(difference_type diff) // 同上 { data -= diff; return data; } };
difference_typeが定義されていないみたい…。ついでにいうとpointerとreferenceも定義されてないみたいなんだけど、そんな複雑なことやらなければvalue_type *とvalue_type &で代用できるからなんとかなるっちゃなんとかなるんだけど。
一応iteratorヘッダ(の中でincludeされているutilityヘッダ)を覗いてみると、
template<class _C, class _Ty, class _D = ptrdiff_t> struct iterator { typedef _C iterator_category; typedef _Ty value_type; typedef _D distance_type; };
ってな感じで定義されてて、なんかtemplateの引数すらも違う感じなんだけども、こういうのが原因でVC付属STLはダメだといわれるのかしら?