Как явным образом создаю экземпляр функции шаблона?
У меня есть функция шаблона с одним аргументом.
Мне нужно создать экземпляр этой функции, не вызывая эту функцию, явно я должен создать экземпляр.
У меня есть эта функция:
template <class T> int function_name(T a) {}
Я создал эту функцию следующим образом:
template int function_name<int>(int);
Но я получил следующие ошибки:
error: expected primary-expression before 'template'
error: expected `;' before 'template'
Ответы
Ответ 1
[РЕДАКТИРОВАТЬ 2]: обратите внимание, что возникла некоторая путаница в отношении кода в исходном вопросе из-за проблем с форматированием кода. См. Ответ AnthonyHatchkins для более подробной информации.
Если вы действительно хотите создать экземпляр (вместо специализации или что-то еще), выполните следующее:
template <typename T> void func(T param) {} // definition
template void func<int>(int param); // explicit instantiation.
[EDIT] Кажется, что существует (много) путаницы в отношении явного инстанцирования и специализации.
Код, который я написал выше, имеет дело с явным экземпляром. Синтаксис специализации отличается.
Вот синтаксис для специализации:
template <typename T> void func(T param) {} // definition
template <> void func<int>(int param) {} // specialization
Обратите внимание, что угловые скобки после шаблона!
Ответ 2
Ваш код верен.
Сообщение об ошибке относится к месту в коде, который вы не указали здесь.
Update:
Исходный код был
template <class T> int function_name(T a) {}
template int function_name<int>(int);
и это было правильно.
Но он не был указан и, таким образом, выглядел так:
template int function_name(T a) {}
template int function_name(int);
Он генерирует следующую ошибку:
a.cpp:1: error: explicit instantiation of non-template ‘int function_name’
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: ‘function_name’ is not a template function
который явно отличается от того, что указано в OP.
В этом варианте вторая строка в порядке (<int>
здесь может быть опущена), но первая строка неисправна. Компилятор не может предположить, что T
является параметром шаблона.