Как явно создать экземпляр функции-шаблона?
У меня есть шаблонная функция с одним аргументом. Я должен создать экземпляр этой функции без вызова этой функции означает, что я должен создать экземпляр.
У меня есть эта функция:
template <class T> int function_name(T a) {}
Я создал эту функцию следующим образом:
template int function_name<int>(int);
Но я получил следующие ошибки:
error: expected primary-expression before 'template'
error: expected `;' before 'template'
3 ответа
[РЕДАКТИРОВАТЬ 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
Обратите внимание, что угловые скобки после шаблона!
Ваш код правильный.
Сообщение об ошибке относится к месту в коде, которое вы не указали здесь.
Обновить:
Исходный код был
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
это параметр шаблона.
Это может быть полезно для метода создания экземпляра шаблона, когда мы хотим разделить файл cpp / hpp.
// foo.hpp
struct Foo
{
template<typename T>
void myMethod(T var);
};
// foo.cpp
#include <typeinfo>
#include <iostream>
template void Foo::myMethod(int var);
template void Foo::myMethod(double var);
template <typename T>
void Foo::myMethod(T var)
{
std::cout << typeid(T).name() << " - " << var << std::endl;
}
Пример:
Foo foo;
foo.myMethod(1);
foo.myMethod(2.0);
// undefined reference to `void Foo::myMethod(float)'
// foo.myMethod(2.0F); <-- doesn't work as we don't have definition
OUT:
i - 1
d - 2
Вы можете сыграть в нее здесь: https://onlinegdb.com/gwAjMF9QH