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