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


117

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

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

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

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

template int function_name<int>(int);

Но у меня были следующие ошибки:

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

Ответы:


182

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

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

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

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


3
что такое создание или специализация ?
Nawaz

5
Не правда. Вы можете указать компилятору явно создавать экземпляры шаблонов. Google для "явного создания шаблона C ++" для получения дополнительных сведений.
hrnt

8
@Nawaz: ты ошибаешься. Конечно, это всегда компилятор, который создает экземпляр, эта строка представляет собой запрос от программиста к компилятору для создания экземпляра шаблона. Если у вас есть копия стандарта C ++, прочтите 14.7.2 Явное создание экземпляра
Дэвид Родригес - dribeas

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

3
@hrnt: Думаю, ты прав. @Ashot: Я только что заметил, что у синтаксиса нет template<>формы. То, что он написал, отличается от специализации . +1 за то, что научил меня этой обновке. Удаляю свой пост. : D
Наваз

20

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

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

Обновить:

Исходный код был

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


Технически это был не его код, это была правка Билла :) Исходный код template int function_name( T a) { }иtemplate int function_name(int);
hrnt 08

@hrnt Исходный код был отформатирован некорректно, но все же правильно. Если бы я был Баладжи, я бы вернулся и принял ваш ответ, если он сочтет его полезным, но для меня (и, вероятно, для кого-то еще) ваш ответ (хотя сам по себе совершенно правильный) не отвечает на вопрос.
Энтони Хэтчкинс 08

@hrnt Вы правы, исходный код выглядел именно так. Но из-за выведенного аргумента шаблона он все еще работает. Я должен согласиться с Энтони Хэтчкинсом, что ошибка возникает из-за кода, который OP не цитировал, однако я думаю, что ваш ответ по-прежнему полезен для людей, которые не знали о явном создании экземпляра.
mpark 08

Ну возьмите меня к примеру. Я погуглил эту страницу, когда хотел освежить свои хорошо забытые знания о явном создании экземпляров - и это мне не очень помогло. Что касается меня, то в синтаксисе нет никакой путаницы. Что может вызвать путаницу в отношении явного создания экземпляра, так это его использование
Энтони Хэтчкинс,

@AntonyHatchkins Ах, правда - я не смотрел на источник исходного вопроса, а только на то, как он появился на моем экране. Я добавлю +1 и исправлю свой исходный ответ, чтобы отметить путаницу в отношении исходного вопроса.
hrnt 09
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.