Подтвердить что ты не робот

В чем разница между шаблоном <typename T> и шаблоном <class T>. Для меня оба генерируют один и тот же результат

В чем разница между template <typename T> и template <class T>. Для меня оба генерируют один и тот же результат.

например

template <class T>
T Average(T *atArray, int nNumValues)
{
    T tSum = 0;
    for (int nCount=0; nCount < nNumValues; nCount++)
        tSum += atArray[nCount];

    tSum /= nNumValues;
    return tSum;
}

если я изменю его на template <typename T>, тот же

4b9b3361

Ответ 1

Нет никакой разницы. typename и class являются взаимозаменяемыми в объявлении параметра шаблона типа.

Однако при объявлении параметра шаблона шаблона вы должны использовать class (а не typename):

template <template <typename> class    T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!  o noez!

Ответ 2

В большинстве случаев они эквивалентны и взаимозаменяемы, а некоторые предпочитают typename, потому что использование класса ключевого слова в этом контексте кажется запутанным.

Причина, по которой требуется имя типа, заключается в тех двусмысленных случаях при использовании template <class T>, например, вы определяете такой шаблон:

template <class T>
void MyMethod() {
   T::iterator * var;
}

и по какой-то причине пользователь вашего шаблона решает создать экземпляр класса в качестве

class TestObject {
   static int iterator; //ambiguous
};

MyMethod<TestObject>(); //error

Становится двусмысленным то, что должен быть var, экземпляр итератора класса или статического типа int. Поэтому для этих случаев было введено имя типа, чтобы заставить шаблонный объект интерпретироваться как тип.

Ответ 3

Посмотрите на это:

http://www.cplusplus.com/forum/general/8027/

Оба они производят одинаковое поведение. Когда вы используете typename, это более читаемо.