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

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

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

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

Другие вопросы по тегам