class Conteneur = vector<T> avec T en paramètre de modèle ? (vector n'est pas un type puisque c'est un template)
Il n'y a pas de type T dans mon template.
Oui, vector est un template c'est pour ca que je le passe comme template<typename, class>. On ne peut pas dire au compilo que template<typename, class> = vector par defaut ?
Il pourrait le deduire tout seul, non ? Dans d'autres cas il le fait.
-- John Deuf
news.free.fr :
class Conteneur = vector<T> avec T en paramètre de modèle ? (vector
n'est pas un type puisque c'est un template)
Il n'y a pas de type T dans mon template.
Oui, vector est un template c'est pour ca que je le passe comme
template<typename, class>.
On ne peut pas dire au compilo que template<typename, class> = vector par
defaut ?
class Conteneur = vector<T> avec T en paramètre de modèle ? (vector n'est pas un type puisque c'est un template)
Il n'y a pas de type T dans mon template.
Oui, vector est un template c'est pour ca que je le passe comme template<typename, class>. On ne peut pas dire au compilo que template<typename, class> = vector par defaut ?
§14.1/9 : « A default template-argument shall not be specified in a function template declaration or a function template definition, nor in the template-parameter-list of the definition of a member of a class templates. »
Ce que tu veux dire est donc interdit par la norme. (Ne me démande pas pourquoi. Peut-être parce qu'il pose des problèmes quand on veut faire de la déduction de type.)
De la meme facon, est-ce normal qu'il ne trouve pas l'allocator par défaut de la classe vector ?
template <template<typename> class Conteneur > Conteneur<int> ChargeTruc();
Ce n'est pas un problème de trouver l'allocateur par défaut. C'est un problème de typage -- comme pour les fonctions, la présence d'un paramètre par défaut ne change pas le type. Tu as démandé un template avec un seul paramètre. std::vector en a deux. C'est un cas tout à fait parallel à :
void f( int, int = 0 ) ; void (*pf)( int ) = &f ; // illégal
Sauf que, évidemment, dans le cas d'une fonction, tu peux très bien remplacer le paramètre par défaut par un surcharge, pour que ça marche. Et aussi, pour quelqu'un qui comprend le code généré, le pourquoi de la règle est assez évident -- quand on se sert de pf, il faut bien que le compilateur sache combien de paramètres il y en a réelement, pour en passer le bon nombre. J'imagine qu'il y a une motivation semblable derrière la restriction sur les templates, mais j'avoue ne pas assez comprendre sur comment ils marchent pour pouvoir la voir.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
John Deuf wrote:
Est-ce normal que mon compilateur (VC++ 2005) ne prend pas les
arguments par défaut pour les template template ?
§14.1/9 : « A default template-argument shall not be specified
in a function template declaration or a function template
definition, nor in the template-parameter-list of the definition
of a member of a class templates. »
Ce que tu veux dire est donc interdit par la norme. (Ne me
démande pas pourquoi. Peut-être parce qu'il pose des problèmes
quand on veut faire de la déduction de type.)
De la meme facon, est-ce normal qu'il ne trouve pas l'allocator par
défaut de la classe vector ?
template <template<typename> class Conteneur >
Conteneur<int> ChargeTruc();
Ce n'est pas un problème de trouver l'allocateur par défaut.
C'est un problème de typage -- comme pour les fonctions, la
présence d'un paramètre par défaut ne change pas le type. Tu as
démandé un template avec un seul paramètre. std::vector en a
deux. C'est un cas tout à fait parallel à :
void f( int, int = 0 ) ;
void (*pf)( int ) = &f ; // illégal
Sauf que, évidemment, dans le cas d'une fonction, tu peux très
bien remplacer le paramètre par défaut par un surcharge, pour
que ça marche. Et aussi, pour quelqu'un qui comprend le code
généré, le pourquoi de la règle est assez évident -- quand on se
sert de pf, il faut bien que le compilateur sache combien de
paramètres il y en a réelement, pour en passer le bon nombre.
J'imagine qu'il y a une motivation semblable derrière la
restriction sur les templates, mais j'avoue ne pas assez
comprendre sur comment ils marchent pour pouvoir la voir.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
§14.1/9 : « A default template-argument shall not be specified in a function template declaration or a function template definition, nor in the template-parameter-list of the definition of a member of a class templates. »
Ce que tu veux dire est donc interdit par la norme. (Ne me démande pas pourquoi. Peut-être parce qu'il pose des problèmes quand on veut faire de la déduction de type.)
De la meme facon, est-ce normal qu'il ne trouve pas l'allocator par défaut de la classe vector ?
template <template<typename> class Conteneur > Conteneur<int> ChargeTruc();
Ce n'est pas un problème de trouver l'allocateur par défaut. C'est un problème de typage -- comme pour les fonctions, la présence d'un paramètre par défaut ne change pas le type. Tu as démandé un template avec un seul paramètre. std::vector en a deux. C'est un cas tout à fait parallel à :
void f( int, int = 0 ) ; void (*pf)( int ) = &f ; // illégal
Sauf que, évidemment, dans le cas d'une fonction, tu peux très bien remplacer le paramètre par défaut par un surcharge, pour que ça marche. Et aussi, pour quelqu'un qui comprend le code généré, le pourquoi de la règle est assez évident -- quand on se sert de pf, il faut bien que le compilateur sache combien de paramètres il y en a réelement, pour en passer le bon nombre. J'imagine qu'il y a une motivation semblable derrière la restriction sur les templates, mais j'avoue ne pas assez comprendre sur comment ils marchent pour pouvoir la voir.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34