je me remets au C++ après une bonne année de pause, et j'ai du mal
avec un code qui fonctionnait.
Ci joint un exemple minimal:
#include <list>
template <typename T>
class X {
T t;
};
class Toto {
public:
typedef X<int> X;
typedef std::list<int> list;
};
Et mon g++ se plaint:
toto.cpp:10: error: declaration of ‘typedef class X<int> Toto::X’
toto.cpp:4: error: changes meaning of ‘X’ from ‘class X<int>’
J'imagine bien que g++ a raison. En même temps, je trouvais pratique
de pouvoir écrire
Toto::X
comme raccourci de
X<int>
(bon, là c'est pas très parlant, mais quand il y a plein de paramètres
templates, je trouvais ça plus pratique, surtout s'ils changent un jour).
Auriez-vous une idée ?
Merci,
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot=130
> Auriez-vous une id�e ?
Je suis loin d'etre sur que ce soit une bonne idee, mais
typedef ::X<int> X;
devrait passer.
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
>#include <list>
>
>template <typename T>
>class X {
> T t;
>};
>
>class Toto {
>public:
> typedef X<int> X;
> typedef std::list<int> list;
>};
J'ai mis ce texte (et rien d'autre) dans marc.cpp.
Ensuite, je tape
g++ -c -pedantic -Wall marc.cpp && echo ok
et tout marche bien, aucune erreur, juste "ok".
Pour info :
$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu
--enable-libstdcxx-debug --enable-mpfr --with-tune=i686
--enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Voui, c'est ce que j'avais il y a environ un an.
> Pour info :
>
> $ g++ -v
> gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Je suis en 4.4.1. Ca doit faire la différence.
En effet, ça passe.
Est-ce une bonne idée ? Je sais pas. Comment font les gens ?
Il se trainent dans leur code des choses du genre
conteneur_metier< std::string ,
objet_metier< true > >::const_iterator it = toto.begin()
ou
Titi::const_iterator it = toto.begin()
(en attendant d'avoir
auto it = toto.begin() )
> Le 01-12-2009, Jean-Marc Bourguet <j...@bourguet.org> a �crit�:
> > Marc Boyer <Marc....@cert.onera.fr.invalid> writes:
> >
> >> Auriez-vous une id�e ?
> >
> > Je suis loin d'etre sur que ce soit une bonne idee, mais
> >
> > typedef ::X<int> X;
> >
> > devrait passer.
>
> En effet, �a passe.
> Est-ce une bonne id�e ? Je sais pas. Comment font les gens ?
> Il se trainent dans leur code des choses du genre
>
> conteneur_metier< std::string ,
> objet_metier< true > >::const_iterator it = toto.begin()
> ou
> Titi::const_iterator it = toto.begin()
>
> (en attendant d'avoir
> auto it = toto.begin() )
J'evite la surcharge, j'ai des typesdefs mais pas avec en remplacant un
template par qqch du meme nom. (Et je ne sais pas quelle version de gcc a
raison; meme si je pense que ce doit etre la plus recente, je n'ai pas
trouve une reference qui le confirme).
> > Marc Boyer <Marc.Bo...@cert.onera.fr.invalid> writes:
> >> Auriez-vous une idée ?
> > Je suis loin d'etre sur que ce soit une bonne idee, mais
> > typedef ::X<int> X;
> > devrait passer.
> En effet, ça passe.
> Est-ce une bonne idée ? Je sais pas. Comment font les gens ?
> Il se trainent dans leur code des choses du genre
> conteneur_metier< std::string ,
> objet_metier< true > >::const_iterator it = toto.begin()
> ou
> Titi::const_iterator it = toto.begin()
> (en attendant d'avoir
> auto it = toto.begin() )
Chez moi, souvent, il y a des choses comme:
class C
{
typedef std::map<...> Map;
typedef Map::const_iterator Iterator;
// ...
};
, avec des "typename" où il faut si C est un template. Convertit
les majuscules en minuscules, et ça doit marcher aussi. (La clé,
peut-être, c'est l'utilisation de std::. En somme, à peu près la
solution proposée par Jean-Marc.
--
James Kanze
Sauf que les minuscules me servent pour déclarer la variable.
En fait, dans l'exemple réel, j'avais le problème à deux endroits,
un Tree et un Registery (une surcouche à std::map), et ca n'avait
pas trop de sens d'inventer un autre nom.
Merci,