Sometimes you need to help the compiler differentiate between a type expression and a non-type expression. For example:
template void func (type t){t::Str * p;}
Now, say t represents a class type and Str represents a type member of that class. If you meant to declare a pointer of that type, the compiler will assume this expression as multiplication until the template is instantiated. So to help the compiler know this type expression, you can do this:
template void func (type t){typename t::Str * p;}