Значение ключевого слова шаблона в объявлении функции

Что означает «использование ключевого слова 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) {
}

Что означает «шаблон» в приведенном выше случае?
Это просто индикатор того, что эта функция является функцией шаблона?

-2

Решение

Объявление, которое начинается с ключевого слова template и не имеет <заостренные скобки> Сразу после этого вызывается явная реализация. Это означает поиск определения шаблона и включение указанных параметров шаблона, чтобы получить конкретную специализацию функции или специализацию класса. Так что в первом примере компилятор жалуется, что не может создать экземпляр func(Window<int>, int) потому что он еще ничего не знает о шаблоне под названием func,

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

0

Другие решения

Это просто потому, что в вашем первом примере у вас есть определение шаблона

template<typename T>
void func(Window<T>, T) {
}

после принудительной реализации, представленной этой строкой:

template void func(Window<int>, int);

В то время как во втором примере они верны.

Но комментарий к вашему вопросу справедливый, вы задаете основной вопрос («что означает шаблон»), на который лучше всего ответит тщательное изучение предмета.

0

По вопросам рекламы [email protected]