шаблоны С++ без имени типа или класса

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

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

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

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

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

Спасибо!

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


person Mat    schedule 22.10.2010    source источник
comment
Что такое U? Это определение типа int и т. д.?   -  person kennytm    schedule 22.10.2010
comment
я не знаю - если бы это было, тогда был бы смысл? я бы тоже не понял, если бы U заменили на int   -  person Mat    schedule 22.10.2010
comment
В таком случае это может быть аргумент, не являющийся типом (например, созданный как someFunction<10>). Кстати, вопрос не в функции шаблона, а в конструкторе.   -  person UncleBens    schedule 22.10.2010
comment
Ваш код, очевидно, набран из памяти, так как он имеет синтаксические ошибки (нет возвращаемого типа функции). Пожалуйста, скопируйте и вставьте ТОЧНЫЙ код, чтобы мы могли дать окончательный ответ, иначе все просто догадываются.   -  person Martin York    schedule 22.10.2010


Ответы (4)


Этот код неверен (опечатка). В этой ситуации должно быть 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 определением типа в комментарии.

person kennytm    schedule 22.10.2010
comment
вижу - спасибо! но какой смысл использовать шаблон без имени типа? - person Mat; 22.10.2010
comment
@Mat: если этот n действительно используется, мы могли бы выполнить расчет во время компиляции. В настройках с меньшим преимуществом мы могли бы использовать целое число, например. размер массива template<class T, int n> struct Foo { T foo[n]; ... }; - person kennytm; 22.10.2010

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

person Diego Sevilla    schedule 22.10.2010

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

Тот, кто вставил туда букву «У», был слишком умен для своего же блага. Отсюда и ваше замешательство.

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

person C Johnson    schedule 22.10.2010
comment
Как эта теория объясняет, как работает второе использование U? :) - person UncleBens; 22.10.2010

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

person harper    schedule 22.10.2010
comment
Извините, но я так не думаю. Если вы заменяете параметр в шаблоне, он должен читаться как template <>, а затем фактически используемый тип находится в сигнатуре метода/функции. - person Diego Sevilla; 22.10.2010