OVH Cloud OVH Cloud

template template et arguments par defaut

3 réponses
Avatar
John Deuf
Bonjour,

Est-ce normal que mon compilateur (VC++ 2005) ne prend pas les
arguments par d=E9faut pour les template template ?

template <template<typename, class> class Conteneur =3D vector> //erreur
Conteneur<int, allocator<int> > ChargeTruc();

De la meme facon, est-ce normal qu'il ne trouve pas l'allocator par
d=E9faut de la classe vector ?

template <template<typename> class Conteneur >
Conteneur<int> ChargeTruc();

main()
{ vector<int> ma_liste =3D ChargeTruc<vector>();} //erreur

Merci d'avance pour vos =E9claircissements.

3 réponses

Avatar
news.free.fr
bonjour,

Bonjour,

Est-ce normal que mon compilateur (VC++ 2005) ne prend pas les
arguments par défaut pour les template template ?

template <template<typename, class> class Conteneur = vector> //erreur
Conteneur<int, allocator<int> > ChargeTruc();


class Conteneur = vector<T> avec T en paramètre de modèle ? (vector n'est
pas un type puisque c'est un template)

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();

main()
{ vector<int> ma_liste = ChargeTruc<vector>();} //erreur


idem, ChargeTruc<vector<int> >()

Merci d'avance pour vos éclaircissements.


Avatar
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 ?

main()
{ vector<int> ma_liste = ChargeTruc<vector>();} //erreur


idem, ChargeTruc<vector<int> >()


Il pourrait le deduire tout seul, non ?
Dans d'autres cas il le fait.

--
John Deuf


Avatar
kanze
John Deuf wrote:

Est-ce normal que mon compilateur (VC++ 2005) ne prend pas les
arguments par défaut pour les template template ?

template <template<typename, class> class Conteneur = vector> //erreur
Conteneur<int, allocator<int> > ChargeTruc();


§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();

main()
{ vector<int> ma_liste = ChargeTruc<vector>();} //erreur


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