ПРОСТОЙ ОТВЕТ
Стандарт не допускает использование чисел с плавающей запятой в качестве нетипизированных аргументов шаблона , о которых можно прочитать в следующем разделе стандарта C ++ 11;
14.3.2 / 1 Шаблонные нетиповые аргументы [temp.arg.nontype]
Шаблон-аргумент для нетипичного, не шаблонного шаблона-параметра
должен быть одним из:
для нетипового шаблона-параметра целочисленного или перечислимого типа, преобразованного константного выражения (5.19) типа
шаблоны параметры;
имя нетипового шаблона-параметра; или
константное выражение (5.19), которое обозначает адрес объекта со статической продолжительностью хранения и внешней или внутренней связью
или функция с внешней или внутренней связью, включая функцию
шаблоны и идентификаторы шаблонов функций, но исключая нестатический класс
члены, выраженные (игнорируя скобки) как & id-выражение, кроме
что & может быть опущено, если имя относится к функции или массиву
и должен быть опущен, если соответствующий шаблон-параметр является
ссылка; или
константное выражение, которое оценивается как нулевое значение указателя (4.10); или
константное выражение, которое оценивается как нулевое значение указателя на член (4.11); или
указатель на член, выраженный как описано в 5.3.1.
Но .. но .. ПОЧЕМУ!?
Вероятно, это связано с тем, что вычисления с плавающей запятой не могут быть представлены точно. Если бы это было разрешено, это могло / привело бы к ошибочному / странному поведению при выполнении чего-либо подобного;
func<1/3.f> ();
func<2/6.f> ();
Мы хотели вызвать одну и ту же функцию дважды, но это может быть не так, поскольку представление двух вычислений с плавающей запятой не обязательно будет точно одинаковым.
Как бы я представлял значения с плавающей запятой в качестве аргументов шаблона?
С помощью C++11
вы можете написать несколько довольно продвинутых константных выражений ( constexpr ), которые будут вычислять числитель / знаменатель времени компиляции с плавающим значением, а затем передавать эти два как отдельные целочисленные аргументы.
Не забудьте определить какой-то порог так, чтобы значения с плавающей запятой, близкие друг к другу, давали один и тот же числитель / знаменатель , в противном случае это было бы бессмысленно, так как тогда он даст тот же результат, ранее упомянутый в качестве причины чтобы разрешить значения с плавающей запятой как нетиповые аргументы шаблона .