Что означает «использование ключевого слова template в объявлении функции»?
В этом примере ошибки компилятора с ошибкой: «func» не является функцией шаблона.
template<typename T>
struct Window {
T value;
};
template void func(Window<int>, int);
template<typename T>
void func(Window<T>, T) {
}
int main(void) {
}
Но ниже пример в порядке.
template<typename T>
struct Window {
T value;
};
template<typename T>
void func(Window<T>, T) {
}
template void func(Window<int>, int);
int main(void) {
}
Что означает «шаблон» в приведенном выше случае?
Это просто индикатор того, что эта функция является функцией шаблона?
Объявление, которое начинается с ключевого слова template
и не имеет <
заостренные скобки>
Сразу после этого вызывается явная реализация. Это означает поиск определения шаблона и включение указанных параметров шаблона, чтобы получить конкретную специализацию функции или специализацию класса. Так что в первом примере компилятор жалуется, что не может создать экземпляр func(Window<int>, int)
потому что он еще ничего не знает о шаблоне под названием func
,
Явные экземпляры обычно не нужны, так как шаблоны могут быть неявно созданы только при попытке их использовать. Но явная реализация дает некоторый контроль над тем, где и как появляются связанные символы компоновщика, и в некоторых случаях может использоваться для перемещения определения шаблона из файла заголовка в исходный файл.
Это просто потому, что в вашем первом примере у вас есть определение шаблона
template<typename T>
void func(Window<T>, T) {
}
после принудительной реализации, представленной этой строкой:
template void func(Window<int>, int);
В то время как во втором примере они верны.
Но комментарий к вашему вопросу справедливый, вы задаете основной вопрос («что означает шаблон»), на который лучше всего ответит тщательное изучение предмета.