LA RESPUESTA SIMPLE
El estándar no permite puntos flotantes como argumentos de plantilla que no sean de tipo , sobre los cuales se puede leer en la siguiente sección del estándar C ++ 11;
14.3.2 / 1 Argumentos de no tipo de plantilla [temp.arg.nontype]
Un argumento de plantilla para un parámetro de plantilla que no sea de tipo ni de plantilla será uno de los siguientes:
para un parámetro de plantilla que no es de tipo de tipo integral o enumeración, una expresión constante convertida (5.19) del tipo del parámetro de plantilla;
el nombre de un parámetro de plantilla que no es de tipo; o
una expresión constante (5.19) que designa la dirección de un objeto con duración de almacenamiento estático y enlace externo o interno o una función con enlace externo o interno, incluidas las plantillas de función y los identificadores de plantilla de función, pero excluyendo miembros de clase no estáticos, expresada (ignorando paréntesis) como & id-expression, excepto que & puede omitirse si el nombre se refiere a una función o matriz y se omitirá si el parámetro de plantilla correspondiente es una referencia; o
una expresión constante que se evalúa como un valor de puntero nulo (4.10); o
una expresión constante que se evalúa como un valor de puntero de miembro nulo (4.11); o
un puntero a miembro expresado como se describe en 5.3.1.
Pero ... pero ... ¿¡POR QUÉ !?
Probablemente se deba al hecho de que los cálculos de coma flotante no se pueden representar de manera exacta. Si estuviera permitido, podría / resultaría en un comportamiento erróneo / extraño al hacer algo como esto;
func<1/3.f> ();
func<2/6.f> ();
Queríamos llamar a la misma función dos veces, pero este podría no ser el caso, ya que no se garantiza que la representación de punto flotante de los dos cálculos sea exactamente la misma.
¿Cómo representaría valores de punto flotante como argumentos de plantilla?
Con C++11
podría escribir algunas expresiones constantes bastante avanzadas ( constexpr ) que calcularían el numerador / denominador de un tiempo de compilación de valor flotante y luego pasarían estos dos como argumentos enteros separados.
Recuerde definir algún tipo de umbral para que los valores de punto flotante cercanos entre sí produzcan el mismo numerador / denominador ; de lo contrario, no tiene sentido, ya que producirá el mismo resultado mencionado anteriormente como una razón para no permitir valores de punto flotante como no tipo argumentos de plantilla .
float
como un parámetro de plantilla que no es de tipo ? ¿En qué capítulo es ese?