Рассмотрим шаблонную функцию, которая принимает T и выполняет модуль (%) или простое сложение (+) в этом отношении.
template <class T>
T GetT(T t1, T t2)
{
return t1%t2;
}
В этом коде вы видите NO ERROR.Хорошо.Когда я передаю два целых числа, он компилируется:
GetT(10,20);
Но когда я передаю float / double, он НЕ компилируется:
GetT(10.6, 20.5);
Компилятор выдаст: error C2296: '%' : illegal, left operand has type 'double'
и другие связанные ошибки.Дело в том, что код шаблона не компилируется, пока вы не создадите его хотя бы один раз для определенного типа данных.Код шаблона остается ненужным - компилятору все равно, что на самом деле внутри кода.В вашем случае CPP - это не что иное, как текстовый файл, который компилятор проигнорировал - все это.
Сказав, что, когда я использую оператор +
вместо оператора %
, он будет работать для всехбазовые типы данных, но не для классов, которые отсутствуют operator +
.В этом случае компилятор снова скомпилирует материал шаблона для этого типа данных (класса).
Существуют случаи, когда компилятор и компоновщик работают вместе, чтобы уменьшить окончательный размер двоичного кода, когда они видят, что некоторый код дублируется и будет одинаковым для всех / нескольких типов данных.Но это другой случай.