Шаблоны c ++ без "typename" или "class" - PullRequest
4 голосов
/ 22 октября 2010

Я привык писать такие шаблоны:

template<typename T>
void someFunction(SomeClass<T> argument);

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

template<U>
void someFunction(SomeClass<U> argument);

насколько я знаю, можно использовать "typename" и "class" взаимозаменяемо (за исключением некоторых деталей, касающихся вложенных типов ..) но что это значит, если я вообще не ставлю ключевое слово в скобках?

спасибо!

обсуждаемая тема: Проблемы при написании конструктора копирования для умного указателя

Ответы [ 4 ]

12 голосов
/ 22 октября 2010

Этот код неверен (опечатка). В этой ситуации должно быть typename или class.


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

// template <int n>, but n is not used, so we can ignore the name.
template <int>
void foo(std::vector<int>* x) {
}

int main () {
  foo<4>(0);
}

и следующее:

typedef int U;

// template <U n>, but n is not used, so we can ignore the name.
template <U>
void foo(std::vector<U>* x) {
}

int main () {
  foo<4>(0);
}

Вот почему я спросил, является ли U typedef в комментарии.

2 голосов
/ 22 октября 2010

Я думаю, что это была просто ошибка человека, который спросил, что забыл добавить «имя типа» или «класс» Ответы просто скопировать / вставить код, и это тоже плохо.

0 голосов
/ 22 октября 2010

Если U является типом, то это шаблонная специализация

0 голосов
/ 22 октября 2010

Я уверен, что U - это макрос. Я не думаю, что вместо U будет работать просто typedef, так как компиляторы должны видеть либо одно из двух ключевых слов 'class' или 'typename' в скобках, чтобы шаблоны компилировались.

Кто бы ни положил туда "U", он был слишком умен для их же блага. Таким образом, ваше замешательство.

Добро пожаловать в мир поддержки грязного кода других людей.

...