В чем разница между "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>
В других случаях они взаимозаменяемы.