Bonjour,
Peut-on écrire et si oui comment, le code suivant :
Merci!Code:
1
2
3
4
5
6
7
8 template< template<typename> class A> struct A {/*...*/}; template< typename T, int D> struct B : A< template<typename T> B<T,D> > {/*...*/};
Version imprimable
Bonjour,
Peut-on écrire et si oui comment, le code suivant :
Merci!Code:
1
2
3
4
5
6
7
8 template< template<typename> class A> struct A {/*...*/}; template< typename T, int D> struct B : A< template<typename T> B<T,D> > {/*...*/};
est un type, non une classe template.Code:B<T,D>
En l'état actuel des choses, ta structure A attent une classe template à un paramètre et non un type.
Regarde la différence entre ces deux codes:
Code:
1
2
3
4
5
6
7
8 template < class Z> //A attend un type struct A {}; template< typename T, int D> struct B : A< B<T,D> > // B<T,D> est un type, ca rulz {};
Code:
1
2
3
4
5
6
7
8
9
10
11 template <class Z> struct C{}; template< template<typename> class A> // A attend une classe template à un paramètre struct A {/*...*/}; template< typename T, int D> struct B : A< C > //on donne à A une classe template à un paramètre {/*...*/};
Merci de ta réponse!
Ok j'ai compris ce point, ce que je voulais savoir c'est si on pouvait indiquer la variation d'un unique paramètre template par :
(Ou D est fixé et T ne l'est pas...)Code:template<typename T> B<T,D>
Oui, c'est ce qu'il me semble que l'auteur veut, et c'est autorisé pour les classes/structures. C'est souvent utilisé pour les classes de traits par exemple.
Oui j'ai essayé ce code et... il ne fonctionne pas...
La syntaxe des spécialisation partielle est, AMHA, peu intuitive car il faut rappeler les types après la classe.
Edit: je viens de me rappeler pourquoi il faut redire les types. C'est pour éviter que le compilo ne croit qu'il s'agisse d'une redéfinition à un paramètre à la place d'une spécialisation partielle.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 template < class Z> //A attend un type struct A {}; template< typename T, int D> struct B : A< B<T,D> > // B<T,D> est un type, ca rulz {}; template< typename T> // D est fixé. struct B<T,42> : A< B<T,42> > //note ici qu'on aurait pu passer deux entiers différent //Le type envoyé à A est dérivé à partir de la premiere forme de B. {};