I think this is valid code, I found it while looking to workarounds for PR 14777. template <typename T> struct B { protected: typedef int M; }; template <typename T> struct A : B<T> { using typename B<T>::M; typedef M N; A (int = N ()); }; A<int> a = A<int> (); In 3.3 (without the typename before B<T>::M as with gives a parse error), it gives a warning: pr14777.cc:11: warning: `A<T>::M' is implicitly a typename pr14777.cc:11: warning: implicit typename is deprecated, please see the documentation for details Note without templates this works: struct B { protected: typedef int M; }; struct A : B { using B::M; typedef M N; A (int = N ()); }; A a = A ();
A dup of 14258: in GCC, using declarations are implemented just like the old style access declarations, so they don't "record" the fact that a name imported by them is bound to a type rather than a function or a variable. *** This bug has been marked as a duplicate of 14258 ***