msvc の /Za オプションでエラー

msvc で、/Za(言語拡張機能の無効化)オプションを付けてコンパイルすると次のコードはエラーになります。

template<typename t>
struct hoge{
    typedef t type;
};

template<typename t>
struct foo : hoge<t>{
    typedef typename foo<t>::type type;  // ここら辺でエラー
};

typedef foo<int>::type piyo;

int main(){}

C++ 的にこれは正しいんでしょうか。
gcc 4.5.2 や clang 2.9 だと問題がないので、原因はよく分かりません……。
一応、メタ関数でラップすれば回避できます。

template<typename t>
struct element_type{
    typedef typename t::type type;
};

template<typename t>
struct hoge{
    typedef t type;
};

template<typename t>
struct foo : hoge<t>{
    typedef typename element_type<foo<t> >::type type;
//    typedef typename foo<t>::type type;
};


そして多分同様の理由で次のコードもエラーになります。

//#define boost_range_enable_concept_assert 0 // concept check を切れば well-formed
#include <boost/range/algorithm/for_each.hpp>

int main(){
    int array[] = {0, 1, 2, 3, 4};
    boost::for_each(array, [](int){});
    return 0;
}

さて、どうしたものか。