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; }
さて、どうしたものか。