В чем разница между шаблоном <typename T> и шаблоном <class T>. Для меня оба дают одинаковый результат - PullRequest
27 голосов
/ 15 марта 2011

В чем разница между 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>, то же самое

Ответы [ 3 ]

60 голосов
/ 15 марта 2011

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

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

template <template <typename> class    T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!  o noez!
4 голосов
/ 15 марта 2011

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

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

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

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

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

MyMethod<TestObject>(); //error

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

1 голос
/ 15 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...