2013-02-15 2 views
-2

Что означает «использование ключевого слова template в объявлении функции»?Значение ключевого слова 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) { 
} 

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

+1

Это фундаментальные концепции, которые вы можете найти в любом учебнике или учебнике. Google, безусловно, может указать на многие из них. –

ответ

0

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

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

+0

Благодарим вас за ваш ответ. Не могли бы вы привести несколько примеров, когда требуется явный instantiaiton? Вы прокомментировали некоторые ситуации, но я не могу понять. –

+0

Я понял. Явная инстанция необходима, если функция шаблона или класс находится в отдельных исходных файлах. Создание экземпляра Tempate происходит только тогда, когда оно вызывается. http://msdn.microsoft.com/en-US/library/7k8twfx7(v=vs.80).aspx –

0

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

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

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

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

В то время как во втором примере они» верный путь.

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

Смежные вопросы