 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marc Boyer Guest
|
Posted: Tue Sep 07, 2004 8:53 am Post subject: Template, argument par defaut et declaration en avant |
|
|
Bonjour,
bon, je reprends un (gros) code C++, alors je vais avoir je crois pas
mal de questions.
Pour le moment, j'ai un problème de template + argument template par defaut
+ declaration en avant.
Soit une classe avec un argument template par defaut, genre
template <class T,
template
class Collection {
T t;
cont<int> c;
};
J'ai besoin dans une autre classe de faire une déclaration en avant,
mais comme je ne fixe pas dans ce cas de valeur au 2ème argument
template, il faut que je fasse une déclaration en avant complète:
template <class T,
template
class Collection;
Et quand je définis la classe, il rale d'une redéclaration
des arguments par défaut...
J'ai pensé à un fichier du genre
CollectionFwd.h
dans la même veine que
iosfwd
mais est-ce que je sors pas le marteau pour écraser une mouche ?
Est-ce qu'il y a des pratiques "habituelles" ?
Vous faites comment vous ?
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Sep 07, 2004 9:00 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Jean-Marc Bourguet wrote:
| Quote: | Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Vous faites comment vous ?
Il n'y a guere le choix: on ne peut donner les arguments par defaut
qu'une fois.
|
Donc, CollectionFwd.h ?
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Sep 07, 2004 9:14 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
| Quote: | Jean-Marc Bourguet wrote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Vous faites comment vous ?
Il n'y a guere le choix: on ne peut donner les arguments par defaut
qu'une fois.
Donc, CollectionFwd.h ?
|
Oui. Protege contre la double inclusion, fournissant les arguments
par defaut et inclus dans le fichier avec la definition de la classe
template.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Sep 07, 2004 9:21 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Jean-Marc Bourguet wrote:
| Quote: | Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Donc, CollectionFwd.h ?
Oui. Protege contre la double inclusion, fournissant les arguments
par defaut et inclus dans le fichier avec la definition de la classe
template.
|
Vivement une gestion des modules en C++.
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
|
|
| Back to top |
|
 |
Jonathan Mcdougall Guest
|
Posted: Tue Sep 07, 2004 9:25 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
| Quote: | Soit une classe avec un argument template par defaut, genre
template <class T,
template
class Collection {
T t;
cont<int> c;
};
|
Premièrement, ça ne devrait pas compiler puisque std::list prend (au moins)
deux paramètres. Les arguments par défaut de std::list n'entrent pas en
compte ici. Il n'existe pas de moyen standard d'accomplir ceci, puisque les
implémentations sont libres d'ajouter un nombre quelconque paramètress'ils
ont des valeurs par défaut. Comme tu dois les spécifier, une implémentation
utilisant 3 paramètres casserait ton code. En passant, c'est un defect dans
le standard.
Deuxièmement, il te manque un 'class' devant 'cont' :
template <class T, template
class Collection
{
T t;
cont<int, std::allocator c;
};
Normalement, ceci devrait compiler, mais ce n'est pas portable puisque
j'assume que std::list prend deux paramètres. Je répète que les arguments
par défaut ne s'appliquent pas et qu'il faut spécifier manuellement
std::allocator. Tu vois que côté portabilité, ça laisse à désirer.
| Quote: | J'ai besoin dans une autre classe de faire une déclaration en avant,
mais comme je ne fixe pas dans ce cas de valeur au 2ème argument
template, il faut que je fasse une déclaration en avant complète:
template <class T,
template
class Collection;
|
Ceci devrait être
template <class T, template
class Collection;
Mais les mêmes remarques s'appliquent. Note filalement que j'ai omis les
noms dans le template de 'cont' : ils sont inutiles ou mêlant au mieux.
| Quote: |
Et quand je définis la classe, il rale d'une redéclaration
des arguments par défaut...
|
Oui, au même titre que
void f(int a=2)
{
}
void f(int a=2);
Tu n'as qu'un choix : omettre le paramètre par défaut dans la définition du
template. À partir de là, tu peux simplement copier la déclaration du
template là où tu en as besoin (possiblement dans le même fichier que
l'implémentation) ou simplement l'inclure par un header.
// mon_fwd.h
template <class T, template
class Collection;
// mon_template.h
template <class T, template
class Collection
{
T t;
C<int, std::allocator c;
};
// test1.cpp
# include "mon_fwd.h"
template <class T, template
void f(Collection<T, C> &c)
{
// c.whatever();
}
// test2.cpp
# include "mon_template.h"
template <class T, template
void f(Collection<T, C> &c)
{
c.whatever();
}
Jonathan
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Sep 07, 2004 9:28 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
| Quote: | Jean-Marc Bourguet wrote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Donc, CollectionFwd.h ?
Oui. Protege contre la double inclusion, fournissant les arguments
par defaut et inclus dans le fichier avec la definition de la classe
template.
Vivement une gestion des modules en C++.
|
Tu as une proposition? C'est un des points ou j'ai chercher a
articuler mes desideratas mais je n'arrive pas a quelque chose qui
vaille la peine d'etre discutte.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 07, 2004 9:32 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
| Quote: | Bonjour,
bon, je reprends un (gros) code C++, alors je vais avoir je crois pas
mal de questions.
Pour le moment, j'ai un problème de template + argument template par defaut
+ declaration en avant.
Soit une classe avec un argument template par defaut, genre
template <class T,
template
|
Ça ne marchera pas -- excepté si tu comptes sur le gros bug de GCC.
std::list prend deux arguments templates.
| Quote: | class Collection {
T t;
cont<int> c;
};
J'ai besoin dans une autre classe de faire une déclaration en avant,
mais comme je ne fixe pas dans ce cas de valeur au 2ème argument
template, il faut que je fasse une déclaration en avant complète:
template <class T,
template
class Collection;
Et quand je définis la classe, il rale d'une redéclaration
des arguments par défaut...
|
Oui. Les arguments par défaut des templates marche à peu près comme
les arguments par défaut des fonctions -- cela définit une valeur.
| Quote: |
J'ai pensé à un fichier du genre
CollectionFwd.h
dans la même veine que
iosfwd
mais est-ce que je sors pas le marteau pour écraser une mouche ?
|
Bah pourquoi pas simplement
template<class T, template
struct Collection;
// ...
template<class T, template
struct Collection {
// ...
};
Les paramètres templates de template, c'est un rigide, pourquoi pas
simplement une paramètre type ?
-- Gaby
|
|
| Back to top |
|
 |
Jonathan Mcdougall Guest
|
Posted: Tue Sep 07, 2004 9:36 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Grrr...
| Quote: | // mon_template.h
template <class T, template
class Collection
{
T t;
C<int, std::allocator c;
};
|
Devrait être
// mon_template.h
template <class T, template
class Collection
{
T t;
C<int, std::allocator c;
};
Jonathan
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 07, 2004 9:36 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
"Jonathan Mcdougall" <jonathanmcdougall (AT) DELyahoo (DOT) ca> writes:
| Quote: | Soit une classe avec un argument template par defaut, genre
template <class T,
template
class Collection {
T t;
cont<int> c;
};
Premièrement, ça ne devrait pas compiler puisque std::list prend (au moins)
|
std::list prend exactement deux arguments, pas moins, pas plus.
| Quote: | deux paramètres. Les arguments par défaut de std::list n'entrent pas en
compte ici. Il n'existe pas de moyen standard d'accomplir ceci, puisque les
implémentations sont libres d'ajouter un nombre quelconque paramètress'ils
ont des valeurs par défaut.
|
Ce n'est pas permis.
| Quote: | Comme tu dois les spécifier, une implémentation
utilisant 3 paramètres casserait ton code. En passant, c'est un defect dans
le standard.
|
Bah non, il a été clarifié que ce n'est pas permis.
-- Gaby
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Tue Sep 07, 2004 9:38 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:
| Quote: | Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Jean-Marc Bourguet wrote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Donc, CollectionFwd.h ?
Oui. Protege contre la double inclusion, fournissant les arguments
par defaut et inclus dans le fichier avec la definition de la classe
template.
Vivement une gestion des modules en C++.
Tu as une proposition? C'est un des points ou j'ai chercher a
articuler mes desideratas mais je n'arrive pas a quelque chose qui
vaille la peine d'etre discutte.
|
C'est loin d'être évident, surtout si on veut une compatibilité avec
l'existant.
-- Gaby
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Sep 07, 2004 9:42 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Jonathan Mcdougall wrote:
| Quote: | Soit une classe avec un argument template par defaut, genre
template <class T,
template
class Collection {
T t;
cont<int> c;
};
Premièrement, ça ne devrait pas compiler puisque std::list prend (au moins)
deux paramètres.
|
Mon g++ 3.2.2 l'accepte sans broncher, même en
-ansi -Wall -pedantic
| Quote: | Les arguments par défaut de std::list n'entrent pas en
compte ici. Il n'existe pas de moyen standard d'accomplir ceci, puisque les
implémentations sont libres d'ajouter un nombre quelconque paramètress'ils
ont des valeurs par défaut. Comme tu dois les spécifier, une implémentation
utilisant 3 paramètres casserait ton code. En passant, c'est un defect dans
le standard.
|
Ce que j'aime bien en C++, c'est qu'on arrive vite à mettre le
doigt sans le savoir sur des pb dans la norme.
| Quote: | Deuxièmement, il te manque un 'class' devant 'cont' :
|
Sorry, pb de copier/coller.
| Quote: | Tu vois que côté portabilité, ça laisse à désirer.
|
Je prends note.
Ceci dit, le code est actuellement plein de
_gnu_cxx
donc la portabilité est pas la priorité du moment. Sans
compter que ça utilise un bilbilothèque (nana) qui dit
explicitement avoir besoin de extensions GNU pour compiler,
donc, tant que ça accepte de compiler avec g++, je suis
content.
| Quote: | Tu n'as qu'un choix : omettre le paramètre par défaut dans la définition du
template. À partir de là, tu peux simplement copier la déclaration du
template là où tu en as besoin (possiblement dans le même fichier que
l'implémentation) ou simplement l'inclure par un header.
// mon_fwd.h
template <class T, template
class Collection;
|
Je me suis rabattu sur ça en effet.
Merci,
Marc
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Sep 07, 2004 9:43 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Jean-Marc Bourguet wrote:
| Quote: | Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Jean-Marc Bourguet wrote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Donc, CollectionFwd.h ?
Oui. Protege contre la double inclusion, fournissant les arguments
par defaut et inclus dans le fichier avec la definition de la classe
template.
Vivement une gestion des modules en C++.
Tu as une proposition?
|
Non... J'ai des problèmes avec la solution actuelle, mais
pas de proposition.
| Quote: | C'est un des points ou j'ai chercher a
articuler mes desideratas mais je n'arrive pas a quelque chose qui
vaille la peine d'etre discutte.
|
Si tu veux lancer une discussion ici, je lirais avec plaisir.
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Sep 07, 2004 9:49 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:
| Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
|
| > Jean-Marc Bourguet wrote:
| > > Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
| > >> Donc, CollectionFwd.h ?
|
| > > Oui. Protege contre la double inclusion, fournissant les arguments
| > > par defaut et inclus dans le fichier avec la definition de la classe
| > > template.
|
| > Vivement une gestion des modules en C++.
|
| Tu as une proposition? C'est un des points ou j'ai chercher a
| articuler mes desideratas mais je n'arrive pas a quelque chose qui
| vaille la peine d'etre discutte.
C'est loin d'être évident, surtout si on veut une compatibilité avec
l'existant.
|
C'etait bien ma conclusion. Mais un esprit neuf pouvait avoir l'idee
lumineuse que je n'ai pas eue a cause de mes prejuges.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Sep 07, 2004 9:49 am Post subject: Re: Template, argument par defaut et declaration en avant |
|
|
Gabriel Dos Reis wrote:
| Quote: | Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
| Soit une classe avec un argument template par defaut, genre
| template <class T,
| template
Ça ne marchera pas -- excepté si tu comptes sur le gros bug de GCC.
std::list prend deux arguments templates.
|
GCC est en effet mon compilateur, et avant que de venir demander
des conseils ici, je me repose sur son expertise à lui (qui est
bien au delà de la mienne).
| Quote: | Oui. Les arguments par défaut des templates marche à peu près comme
les arguments par défaut des fonctions -- cela définit une valeur.
|
| J'ai pensé à un fichier du genre
| CollectionFwd.h
| dans la même veine que
| iosfwd
| mais est-ce que je sors pas le marteau pour écraser une mouche ?
Bah pourquoi pas simplement
template<class T, template
struct Collection;
// ...
template<class T, template
struct Collection {
// ...
};
|
Pour un problème de maintenance: il y a plusieurs fichiers
qui ont besoin de cette déclaration en avant, et si un jour je
réalise que std::deque est une meilleure solution par
defaut, il vaudrait mieux que je n'ai qu'un seul fichier
à modifier.
| Quote: | Les paramètres templates de template, c'est un rigide, pourquoi pas
simplement une paramètre type ?
|
Heuh, je veux bien essayer si tu m'explique à quoi tu penses.
Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|