В чем разница между "template <class T>" и "template <typename T>"?

Возможный дубликат:
Используйте 'class' или 'typename' для параметров шаблона?

Я вижу две разные объявления классов шаблонов:

template <class T> class SampleClass1
{
    // ...
};

и

template <typename T> class SampleClass2
{
    // ...
};

В чем разница между этими двумя кодами?

EDIT: я исправил неверное ключевое слово "typedef" на "typename".

Ответ 1

Если

template <typedef T> class SampleClass2

вы имеете в виду

template <typename T> class SampleClass2

тогда нет никакой разницы. Использование class и typename (в контексте параметра шаблона, относящегося к типу) является взаимозаменяемым.

Причина, по которой оба слова разрешены здесь, является исторической. Подробнее см. в этой статье.

Ответ 2

В случае шаблона шаблона

template <typename T, template <typename> class Wrapper>
class Foo {
    //...
  private:
    Wrapper<T> data;
};

Вы должны использовать класс перед именем класса. Это неверно:

template <typename T, template <typename> typename Wrapper>

но это нормально:

template <typename T, template <class> class Wrapper>

В других случаях они взаимозаменяемы.