LA RÉPONSE SIMPLE
La norme ne permet pas de floating points comme non-type de modèle-arguments, qui peut être lu dans la section suivante du C++11 standard;
14.3.2/1 Modèle non-arguments de type [temp.arg.nontype]
Un modèle d'argument pour un non-type, non-template template-parameter
doit être:
pour un non-type de modèle à paramètre d'intégrales ou de type énumération, un converti expression constante (5.19) du type de la
template-parameter;
le nom d'un non-type de modèle à paramètre; ou
une expression constante (5.19) qui désigne l'adresse d'un objet statique de la durée de stockage et externe ou interne de liaison
ou d'une fonction externe ou interne de liaison, y compris la fonction
les modèles et le modèle de fonction-id, mais à l'exclusion des non-statique de la classe
membres, exprimée (en ignorant les parenthèses) & id-expression, à l'exception de
que l' & peut être omis si le nom fait référence à une fonction ou un tableau
et doit être omis si le modèle correspondant paramètre est un
de référence; ou
une expression constante qui donne une valeur de pointeur null (4.10); ou
une constante expression qui renvoie une valeur null membre de la valeur du pointeur (4.11); ou
un pointeur sur membre, tel que décrit à l'article 5.3.1.
Mais.. mais.. POURQUOI!?
C'est probablement dû au fait que floating points ne peuvent pas être représentées de manière exacte. Si c'était autorisé, il pourrait/aurait pour résultat erroné/comportement bizarre quand vous faites quelque chose comme cela;
func<1/3.f> ();
func<2/6.f> ();
Nous avons pour but d'appeler la même fonction deux fois, mais cela pourrait ne pas être le cas étant donné la représentation à virgule flottante de deux calculs n'est pas garanti d'être exactement le même.
Comment pourrais-je représenter les valeurs à virgule flottante comme arguments de modèle?
Avec C++11
vous pouvez écrire quelques assez avancée constante des expressions (constexpr) qui permettrait de calculer le numérateur/dénominateur d'une valeur flottante moment de la compilation et de transmettre ensuite ces deux distincts arguments entiers.
N'oubliez pas de définir une sorte de seuil, de sorte que les valeurs à virgule flottante proches les uns des autres, vous obtiendrez le même numérateur/denomitor, sinon c'est un peu inutile puisqu'il va ensuite donner le même résultat précédemment mentionné comme raison de ne pas permettre à des valeurs à virgule flottante en tant que non-gabarit de type d'arguments.