VC2005 Breaking Change: typename’ needed for dependent name to be treated as a type

Original Code:

template<class T>
const T::X& f(T::Z* p);

template<class T, int N>
struct Baz{};

template<class T>
struct Blah : public Baz< T::Type, T::Value>
{
typedef T::X Type;
Type foo();
T::X bar();
operator T::Z();
};

Errors VC2005 issue:

sample.cpp(2) : warning C4346: 'T::X' : dependent name is not a type
prefix with 'typename' to indicate a type
sample.cpp(2) : error C2143: syntax error : missing ';' before '&'
sample.cpp(2) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
sample.cpp(2) : fatal error C1903: unable to recover from previous erro(s); stopping compilation

Code after applying the fix:

template<class T>
const typename T::X& f(typename T::Z* p);

template<class T, int N>
struct Baz{};

template<class T>
struct Blah : public Baz<typename T::Type, T::Value>
{
typedef typename T::X Type;
Type foo();
typename T::X bar();
operator typename T::Z();
};

Thanks,
Ayman shoukry