typedef vector<int> V;
typedef V::iterator I;
typedef vector<V> VV;

VV vv;

for_each(
  vv.begin(),
  vv.end(),
  tr1::bind(
    &fill<I,int>,
    tr1::bind(static_cast<I (V::*)()>(&V::begin), tr1::placeholders::_1),
    tr1::bind(static_cast<I (V::*)()>(&V::end), tr1::placeholders::_1),
    0));

g++ 4.1.2です。
2次配列の初期化をalgorithmの練習でやってみようと思っていろいろ試行錯誤してみたのですが、
こんな悲しいコードになってしまいます。
static_castは省略できても良さそうなものですが、これはg++特有の問題でしょうか?
(省略できたとしても普通にループ書いたほうがわかりやすいけど)