Кажется, проблема с аргументом шаблона по умолчанию и преобразованием между double и float.Эта проблема не возникает, если вы не используете шаблоны.
Вставьте «f» в конце этого аргумента шаблона по умолчанию так, чтобы оно обрабатывало значение как «число с плавающей точкой» вместо double.Это, кажется, исправляет.
template<typename T>
void fun(T t = 1e-05f);
Но после применения вышеуказанного исправления, если вы объявите это
fun<double>()
, вы получите эквивалентную ошибку.Поэтому лучшее исправление, которое работает как для чисел с плавающей точкой, так и для двойных чисел, - это использовать приведение следующим образом:
template<typename T>
void fun(T t = (T)(1e-05));
Что касается того, является ли это ошибкой компилятора или "неопределенным поведением", я позволю гуру-компилятору звонитьв.