Як явно інстанціювати функцію шаблону?


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

[EDIT 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

Зауважте, що кутові дужки після шаблону!


3
це інстанція чи спеціалізація ?
Наваз

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

8
@Nawaz: ти помилився. Звичайно, завжди компілятор є тим, хто створює цей рядок - це запит від програміста до компілятора про інстанціювання шаблону. Якщо у вас є копія стандарту C ++, прочитайте 14.7.2 Явні екземпляри
David Rodríguez - dribeas

16
Спеціалізація означає, що ви, ймовірно, змінюєте її реалізацію. Функція Instantiation просто означає, що ви призначаєте її до певного підрозділу компіляції, можливо, щоб взяти його унікальну адресу або зробити його доступним як функція бібліотеки або зменшити кількість потужностей.
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

що явно відрізняється від цитованого ОП.

У цьому варіанті другий рядок у порядку (тут <int>його можна опустити), але перший рядок несправний. Компілятор не може здогадатися, що Tце параметр шаблону.


Технічно це був не його код, це редагування Білла :) Оригінальний код є template int function_name( T a) { }іtemplate int function_name(int);
hrnt

@hrnt Оригінальний код був відформатований неправильно, проте він був правильним. Якби я був Баладжі, я б повернувся і прийняв би вашу відповідь, якщо він вважає це корисним, але для мене (і, мабуть, для когось іншого) ваша відповідь (хоча сама по собі є абсолютно правильною) не відповідає на питання.
Антоні Хетчкінс

@hrnt Ви праві, що початковий код виглядав так. Але через виведений аргумент шаблону він все ще працює. Я маю згоду з Ентоні Хаткінсом, що помилка виникає з коду, який ОП не наводив, однак я думаю, що ваша відповідь все ще корисна людям, які не знали про явну інстанцію.
mpark

Ну, візьміть мене для прикладу. Я переглянув цю сторінку, коли хотів оновити свої добре забуті знання про явну інстанцію - і це мені не дуже допомогло. Щодо мене, то синтаксису немає плутанини. Що може спричинити плутанину щодо явної інстанції, - це її використання
Антоні Хаткінс

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