boost::range_iteraotr<>::typeを使うとコンパイルが通らない。たとえば以下のprint関数。
悩んだ末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なんて全然使わないからわからなかった。