sz писал(а):...Тогда если сделать параметр дефолтовым: template<class T = int>
То у компилятора неоднозначность - abs(f1) - что мы хотим? Использования дефолтового параметра темплейта, или генерации функции для float?
По-моему, неоднозначности здесь нет (или не должно быть) - если тип аргумента не совпадает с default argument, то мы хотим сгенерировать новую функцию. В неком роде, это тоже самое что и
Код: Выделить всё
double Bar( double fDummy )
{
return( fDummy );
}
int Bar( int fDummy )
{
return( fDummy );
}
//---------------------------------------------------------------
int main()
{
int lInt = 5;
double lDbl = 5;
char lChr = 5;
lInt = Bar( lInt ); // call int Bar( int )
lDbl = Bar( lDbl ); // call double Bar( double )
lInt = Bar( lDbl ); // call double Bar( double )
lChr = Bar( lChr ); // call int Bar( int )
return( 0 );
}
Здесь нет никакой неоднозначности - тип аргумента определяет вызов. Компилятор смотрит есть ли функция с таким типом аргумента, который мы передаём. Если не, то есть ли функция, к типу аргумента которой можно преобразовать переданный тип - неоднозначности тоже нет (например, char преобразуется в первую очередь к int, но если нет int, то к double).
В случае с template компилятор должен генерировать новую функцию, если нет функции с точно таким типом аргумента как переданный - это не нарушает логики templates. То есть, единственно (или, по крайней мере, очевидный пример) когда default argument в template функции используется, это когда у нас есть default value для аргумента функции и мы опускаем аргумент при вызове функции - та же логика определяет класс, когда мы опускаем тип template. По-моему, так.