template<class T>
struct S {
typedef T U;
};

template<class T>
struct SS : public S<T> {
U a;
};

main(){}
----------------------
をgcc 3.1 でコンパイルすると

test.cc:8: warning: `typename SS<T>::U' is implicitly a typename
test.cc:8: warning: implicit typename is deprecated, please see the documentation for details

というwarningがでます。X::Yという形でないのにimplicitだと
いわれるのがよく分からないんですが、これは正しい動作なんでしょうか?

これがコンパイラの正しい動作だとして、
U => typename SS<T>::U とやる他に回避方法はありませんか?