Problème de typedef et de template

Le
Marc Boyer
Bonjour à tous,

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_mot0
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #20670501
Marc Boyer
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
Fabien LE LEZ
Le #20670591
On Tue, 1 Dec 2009 11:29:47 +0000 (UTC), Marc Boyer

#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)
Marc Boyer
Le #20670751
Le 01-12-2009, Fabien LE LEZ
On Tue, 1 Dec 2009 11:29:47 +0000 (UTC), Marc Boyer

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".



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.

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_mot0
Marc Boyer
Le #20670731
Le 01-12-2009, Jean-Marc Bourguet
Marc Boyer
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() )

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_mot0
Jean-Marc Bourguet
Le #20670711
Marc Boyer
Le 01-12-2009, Jean-Marc Bourguet > Marc Boyer >
>> 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).

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
James Kanze
Le #20670891
On Dec 1, 1:40 pm, Marc Boyer wrote:
Le 01-12-2009, Jean-Marc Bourguet


> Marc Boyer


>> 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.begi n()
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 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
Marc Boyer
Le #20670881
Le 01-12-2009, James Kanze
On Dec 1, 1:40 pm, Marc Boyer wrote:
Chez moi, souvent, il y a des choses comme:

class C
{
typedef std::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.



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,
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_mot0
Publicité
Poster une réponse
Anonyme