dans ce cas pourquoi est ce que Action1(void) ne match pas non plus ?
Version imprimable
dans ce cas pourquoi est ce que Action1(void) ne match pas non plus ?
f(void) est un synonime de f(), void n'est jamais passé comme type dans ce cas
en passant un int j'ai le même message du compilo, pourtant j'ai l'impression que le matching est nickel
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 template<bool f,typename Action,typename P> struct F{ }; template<typename Func,typename Arg> struct F<true,Func(Arg)> { typedef Func exec; typedef Arg param; }; struct Action{ bool operator()(int){return true;} }; int main() { F<1, Action(int)> f; system("pause"); }
ta definition est fausse. Ceci compile :
http://codepad.org/EQjE3b0S
tu melanges le nbr de parametres template de ta classe et le nombre de type pour les définir
ah ok je pensais pas qu'on pouvait modifier le nombre ou type de paramètre d'une classe template, là on passe de bool+typename à typename+typename c'est assez déroutant
non, c'est une specialisation partielle, tu definie ce qui te faut pour specialiser
L'endroit que tu dois regarder pour les paramètres de ta classe, c'est "struct F<true, Func(Arg)>", pas "template" au-dessus.
Ce que tu mets après "template" c'est "bon, je vais avoir besoin de ces choses là", pas "je vais donner ces choses là en paramètre de ma classe telles quelles".
C'est un peu comme pour ça :
T'as qu'un argument dans ta fonction, mais t'as deux paramètres qui rentrent en jeu.Code:
1
2
3 template < template <class> class Container, class Element> void f(const Container<Element>& c)
Quand tu spéciales partiellement de manière non triviale, t'introduis souvent d'autres genres de paramètres, mais ce ne sont pas forcément ceux que tu passeras tels quels à ta classe.
OK, y a pas de bons liens qui traînent sur le net qui traitent de ce sujet ? je trouve rien d'extra via notre ami google
http://cpp.developpez.com/cours/cpp/?page=page_14#LXIV
Ca devrait suffire à comprendre la spécialisation des templates.
la limite de ton lien c'est qu'il n' y a pas d'exemple où le nombre de paramètre de la classe spécialisé apparaissant à droite du nom de la classe est inférieur aux nombres de paramètres figurant dans la déclaration de la classe template non spécialisée...
c'est finalement précisément cette règle que je découvre ici
Les exemple sont fait dans l'auter sens, mais ca marche dans les deux, il n'y a rien de compliquer la-dedans, ou alors précise ce que tu veux savoir, parce que là je vois pas !Citation:
On notera que le nombre des paramètres template déclarés à la suite du mot clé template peut varier, mais que le nombre de valeurs fournies pour la spécialisation est toujours constant (dans l'exemple précédent, il y en a trois).
Le cas que tu veux arrive dès que tu auras un type composé d'autre type, ou du même grene. (Comme les types des fonctions ou les types d'un tableau C-like)
ok j'ai "buggé" mon dernier post est faux, justement le nombre match toujours....
Code:
1
2 template< bool Action,typename P> struct F{ }; // =2
autant pour moiCode:
1
2 struct F<true,Func(Arg)> //=2