Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de typedef et de template

7 réponses
Avatar
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_mot=130

7 réponses

Avatar
Jean-Marc Bourguet
Marc Boyer 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.

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
Avatar
Fabien LE LEZ
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)
Avatar
Marc Boyer
Le 01-12-2009, Fabien LE LEZ a écrit :
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
Avatar
Marc Boyer
Le 01-12-2009, Jean-Marc Bourguet a écrit :
Marc Boyer 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() )

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
Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Le 01-12-2009, Jean-Marc Bourguet a écrit :
> Marc Boyer 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).

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



> Marc Boyer 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.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<...> 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
Avatar
Marc Boyer
Le 01-12-2009, James Kanze a écrit :
On Dec 1, 1:40 pm, Marc Boyer
wrote:
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.



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