Как явным образом создаю экземпляр функции шаблона?

У меня есть функция шаблона с одним аргументом. Мне нужно создать экземпляр этой функции, не вызывая эту функцию, явно я должен создать экземпляр.

У меня есть эта функция:

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 является параметром шаблона.