There's 1 difference. From my point of view, typename implies more or a range of accepted types, whereas class implies only actual classes. However, the difference shows when you expect a template class as a template parameter. For instance:
1 2 3 4 5
// This is wrong:
template <template <typename> typename T>
// This is correct:
template <template <typename> class T>
There's none. I prefer typename since typname can be used outside the template directive to determine a template parameter if the compiler is confused. Look at this: