typename

boost::range_iteraotr<>::typeを使うとコンパイルが通らない。たとえば以下のprint関数。

letsboost::range

悩んだ末Boost.Rangeのドキュメントを読んだところtypenameが必要らしい。

template<typename Range>
void print( Range& r )
{
  typename boost::range_iterator<Range>::type i = begin(r), e = end(r);
  for(; i!=e; ++i)
	cout << *i << endl;
}

typenameなんて全然使わないからわからなかった。

参考: テンプレートあれこれ (4) -- typename の役割