Consider the following code:
template < typename T >
struct A
{
struct B { };
};
template < typename T >
void f( typename A::B ) {
typename A::B
Here, T is in a nondeduced context, which means that T cannot be deduced from the function argument.
The problem is that in the general case, there is a potentially infinite number of possible types T that could match. Consider, for example, if instead of struct B { }; you had typedef int B;.