ダメだこりゃ

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はダメだといわれるのかしら?