Это связано с тем, как работают шаблоны C++. Поскольку компилятор не знает, что такое tmp
, пока вы не вызовете функцию (или, точнее, когда вы не создадите ее экземпляр), он не знает, как написать для нее код. Например, рассмотрим этот шаблон:
template <typename T>
T add(T left, T right) {
return left + right;
}
Если T
является целым числом, то тело функции представляет собой целочисленное сложение. Если T
является двойным, это сложение с плавающей запятой. Если T
является std::string
, это вызов функции std::string::operator+
.
Так как в любой программе на C++ много типов, и многие из них могут быть добавлены, и почти каждый добавляется по-разному, она не может создать код для функции, пока не узнает этот тип. Если попытаться сделать это для всех возможных типов T
, вы получите комбинаторный взрыв возможных реализаций, почти все из которых никогда не используются. Ваше время компиляции и размер двоичного файла были бы огромными, если бы не было никакой пользы.
С шаблонами классов все становится немного сложнее. Создание экземпляра шаблона класса на самом деле не требует создания экземпляров всех функций, если они не вызываются. Возвращаясь к нашему примеру, если бы мы вместо этого написали:
template <typename T>
class Adder {
T add(T left, T right) {
return left + right;
}
};
Adder<int> a;
это все еще не будет создавать экземпляр Adder<int>::add
, даже если у компилятора есть вся информация, чтобы знать, что add<int>
потенциально интересен, потому что вы фактически не вызываете или иным образом не создаете его экземпляр.
person
Daniel H
schedule
03.02.2017
func<int>
будет функция шаблона, то есть шаблон функции со всеми уже известными параметрами шаблона. Это создает экземпляр шаблона, заставляя его материализоваться. - person AnT   schedule 03.02.2017