“Шаблон <>” проти “шаблон” без дужок - яка різниця?


77

Припустимо, я заявив:

template <typename T> void foo(T& t);

Тепер, в чому різниця між

template <> void foo<int>(int& t);

і

template void foo<int>(int& t);

семантично? І чи мають шаблон-без-дужок та шаблон-з-порожніми дужками іншу семантику в інших контекстах?


Пов’язане з: Як змусити конкретний екземпляр шаблону C ++ створити екземпляр?

Відповіді:


70

template <> void foo<int>(int& t);оголошує спеціалізацію шаблону з потенційно іншим корпусом.

template void foo<int>(int& t);викликає явний екземпляр шаблону, але не вводить спеціалізацію. Він просто змушує створювати екземпляр шаблону для певного типу.


3
Це досить заплутано! Я припускаю, що зміст декларації полягає в тому, що компілятор не прийме екземпляр неспеціалізованого шаблону як кандидата, коли спеціалізоване визначення не знайдено?
einpoklum

3
Пояснюючи це трохи більше: перший може бути використаний у файлі заголовка, і в ньому сказано " foo<int>матиме інше тіло foo<T>"; якщо код в іншому місці програми викликає, foo<int>()але ви не надаєте тіло, ви повинні отримати помилку alink.
MM

4
Другий не слід використовувати у файлі заголовка; використання його в одному .cpp-файлі гарантує, що тіло foo<int>(яке використовує foo<T>шаблон для його створення, якщо у вас також не було рядка спеціалізації!) насправді обробляється (це дещо схоже на визначення нешаблонної функції). Зазвичай вам не потрібно робити цього, як це відбувається кожного разу, коли дзвонить якийсь інший код foo<int>, але ви можете зробити це з кількох причин
MM

Менше бентежить, якщо ви бачите <> як особливий випадок порожнього списку параметрів шаблону. Загалом, ви використовуєте цей синтаксис для створення ( можливо часткової ) спеціалізації. Якщо трапляється, що він не має жодних параметрів (тобто не часткових), це дає вам такий синтаксис. Ви все ще заявляєте шаблон .
JDługosz

@jdlugosz: У мене склалося враження, що часткова спеціалізація не супортована ...
einpoklum

13

З класом / структурою,

template <typename T> struct foo {};

Далі йде спеціалізація:

template <> struct foo<int>{};

Нижче наведено явний екземпляр:

template struct foo<int>;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.