Как явно создать экземпляр функции-шаблона? - PullRequest
106 голосов
/ 08 февраля 2011

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

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

template <class T> int function_name(T a) {}

Я создал эту функцию следующим образом:

template int function_name<int>(int);

Но я получил следующие ошибки:

error: expected primary-expression before 'template'
error: expected `;' before 'template'

Ответы [ 2 ]

166 голосов
/ 08 февраля 2011

[РЕДАКТИРОВАТЬ 2]: обратите внимание, что возникла путаница в отношении кода в исходном вопросе из-за проблем с форматированием кода. См. Ответ Энтони Хэтчкинса для более подробной информации.

Если вы действительно хотите создать экземпляр (а не специализироваться или что-то еще) функции, сделайте следующее:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[РЕДАКТИРОВАТЬ] Кажется, что (много) путаницы в отношении явной реализации и специализации. Код, который я разместил выше, имеет дело с явным созданием экземпляра . Синтаксис для специализация отличается. Вот синтаксис для специализации:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Обратите внимание, что угловые скобки после шаблона!

19 голосов
/ 09 декабря 2013

Ваш код правильный.

Сообщение об ошибке относится к месту в коде, который вы здесь не указали.

Обновление:

Оригинальный код

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

, что явно отличается от того, что было указано в ОП.

В этом варианте вторая строка в порядке (здесь можно опустить <int>), но первая строка неверна. Компилятор не может догадаться, что T является параметром шаблона.

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