C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

type membre d'une classe template
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Thierry Noc
Guest





PostPosted: Mon Jan 24, 2005 2:35 pm    Post subject: type membre d'une classe template Reply with quote




Bonjour, il y a quelque temps que j'ai pas fait de C++ et de plus j'ai
échangé gcc 2.95 contre 3.4.2, et je n'arrive pas a compiler le bout de
code suivant, je ne comprend pas pourquoi, j'ai du louper un chapitre:

#include <map>

template <typename Key>
inline void fn()
{
std::map<Key, int>::iterator iter;
}


$ g++ -Wall -c -o tst1.o tst1.cpp
tst1.cpp: In function `void fn()':
tst1.cpp:6: error: expected `;' before "iter"

Back to top
Matthieu Moy
Guest





PostPosted: Mon Jan 24, 2005 2:42 pm    Post subject: Re: type membre d'une classe template Reply with quote



Thierry Noc <thierry.noc (AT) ifrance (DOT) com> writes:

Quote:
Bonjour, il y a quelque temps que j'ai pas fait de C++ et de plus j'ai
échangé gcc 2.95 contre 3.4.2, et je n'arrive pas a compiler le bout de
code suivant, je ne comprend pas pourquoi, j'ai du louper un chapitre:

gcc 3.4 est /beaucoup/ plus respectueux du standard que 2.95. La
migration est difficile mais ça vaut le coup !

Quote:
#include <map

template inline void fn()
{
std::map typename std::map<Key, int>::iterator iter;


Quote:
}

(je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
preciser au compilo que std::map<Key, int>::iterator est un type)

--
Matthieu

Back to top
Stanislas RENAN
Guest





PostPosted: Mon Jan 24, 2005 3:54 pm    Post subject: Re: type membre d'une classe template Reply with quote



Bonjour,


Matthieu Moy a écrit :

Quote:
Thierry Noc <thierry.noc (AT) ifrance (DOT) com> writes:

std::map<Key, int>::iterator iter;

typename std::map<Key, int>::iterator iter;


(je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
preciser au compilo que std::map<Key, int>::iterator est un type)

il me semble que c'est quand tu déclares un pointeur :

std::map<Key, int>::iterator * iter;

sans "typename", le caractère "*" est interprété comme une
multiplication, et std::map<Key, int>::iterator comme un membre à
multiplier.
Pour que l'interprétation du source soit correcte, il faut préciser
typename.

--
Stanislas RENAN

Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Jan 24, 2005 4:49 pm    Post subject: Re: type membre d'une classe template Reply with quote

Stanislas RENAN <nomail (AT) genigraph (DOT) fr> writes:

Quote:
Bonjour,


Matthieu Moy a écrit :

Thierry Noc <thierry.noc (AT) ifrance (DOT) com> writes:

std::map<Key, int>::iterator iter;
typename std::map<Key, int>::iterator iter;


(je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
preciser au compilo que std::map<Key, int>::iterator est un type)

il me semble que c'est quand tu déclares un pointeur :
std::map<Key, int>::iterator * iter;

sans "typename", le caractère "*" est interprété comme une
multiplication, et std::map<Key, int>::iterator comme un membre à
multiplier.
Pour que l'interprétation du source soit correcte, il faut préciser
typename.


template<class T>
void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?

-- Gaby

Back to top
Thierry Noc
Guest





PostPosted: Mon Jan 24, 2005 8:02 pm    Post subject: Re: type membre d'une classe template Reply with quote

Matthieu Moy wrote:

Quote:
template <typename Key
inline void fn()
{
std::map typename std::map<Key, int>::iterator iter;


Bon ben je retourne a l'école. tchao et merci.


Back to top
Thierry Noc
Guest





PostPosted: Mon Jan 24, 2005 8:06 pm    Post subject: Re: type membre d'une classe template Reply with quote

Gabriel Dos Reis wrote:
Quote:

template void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

Pourquoi t'a mis : if (true) {


Back to top
Repondre sur le NG
Guest





PostPosted: Mon Jan 24, 2005 8:18 pm    Post subject: Re: type membre d'une classe template Reply with quote

Gabriel Dos Reis a écrit :

Quote:
template void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?
euh... je ne vois pas le rapport avec le problème précédent.

J'ai dit une bêtise ?

--
Stanislas RENAN


Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Jan 24, 2005 8:19 pm    Post subject: Re: type membre d'une classe template Reply with quote

Thierry Noc <thierry.noc (AT) ifrance (DOT) com> writes:

Quote:
Gabriel Dos Reis wrote:

template void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

Pourquoi t'a mis : if (true) {

un prétexte pour introduire un block ;-)

(et aussi pour dire « si c'était vrai » ;-)

-- Gaby


Back to top
Loïc Joly
Guest





PostPosted: Mon Jan 24, 2005 8:23 pm    Post subject: Re: type membre d'une classe template Reply with quote

Repondre sur le NG wrote:
Quote:
Gabriel Dos Reis a écrit :

template void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?

euh... je ne vois pas le rapport avec le problème précédent.
J'ai dit une bêtise ?

Oui...

--
Loïc

Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Jan 24, 2005 8:28 pm    Post subject: Re: type membre d'une classe template Reply with quote

Repondre sur le NG <invalid (AT) free (DOT) fr> writes:

Quote:
Gabriel Dos Reis a écrit :

template<class T
void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}
est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?
euh... je ne vois pas le rapport avec le problème précédent.

Le rapport est que ce n'est pas seulement dans le contexte de
déclaration de pointeur. Le message n'était pas une contradiction,
mais un complément d'information Smile Je remets du contexte :

# > (je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
# > preciser au compilo que std::map<Key, int>::iterator est un type)
# >
# il me semble que c'est quand tu déclares un pointeur :
# std::map<Key, int>::iterator * iter;

-- Gaby

Back to top
Thierry Noc
Guest





PostPosted: Mon Jan 24, 2005 9:44 pm    Post subject: Re: type membre d'une classe template Reply with quote

Gabriel Dos Reis wrote:

Quote:
| Pourquoi t'a mis : if (true) {

un prétexte pour introduire un block ;-)

(et aussi pour dire « si c'était vrai » ;-)


Ouf, ca vient pas d'une nouvelle norme ;)


Back to top
Stanislas RENAN
Guest





PostPosted: Tue Jan 25, 2005 9:06 am    Post subject: Re: type membre d'une classe template Reply with quote

Loïc Joly a écrit :

Quote:
euh... je ne vois pas le rapport avec le problème précédent.
J'ai dit une bêtise ?


Oui...

amen.


--
Stanislas RENAN

Back to top
Stanislas RENAN
Guest





PostPosted: Tue Jan 25, 2005 9:14 am    Post subject: Re: type membre d'une classe template Reply with quote

Gabriel Dos Reis a écrit :
Quote:
Le rapport est que ce n'est pas seulement dans le contexte de
déclaration de pointeur.
c'est bien possible, mais ça dépasse mes connaissances Smile

En fait j'avais déjà vu ce problème abordé spécifiquement dans le cas du
pointeur, et comme ça m'avait surpris (le coup de la multiplication), je
l'ai retenu (en fait, plus précisément, j'ai eu recours à mes notes).

Quote:
Le message n'était pas une contradiction,
mais un complément d'information Smile Je remets du contexte :
et bien nous attendons que tu nous éclaires à ce propos (en tout cas,

moi).

--
Stanislas RENAN

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Jan 26, 2005 9:37 am    Post subject: Re: type membre d'une classe template Reply with quote

Stanislas RENAN wrote:

Quote:
Matthieu Moy a écrit :

Thierry Noc <thierry.noc (AT) ifrance (DOT) com> writes:

std::map<Key, int>::iterator iter;

typename std::map<Key, int>::iterator iter;

(je ne sais plus exactement avec quoi il y a ambiguité, mais
il faut preciser au compilo que std::map<Key, int>::iterator
est un type)

il me semble que c'est quand tu déclares un pointeur :
std::map<Key, int>::iterator * iter;

sans "typename", le caractère "*" est interprété comme une
multiplication, et std::map<Key, int>::iterator comme un
membre à multiplier.

À peu près. La règle, c'est que le compilateur doit pouvoir
signaler les erreurs de syntaxe sans que le template soit
instantié. Or, pour correctement parser le C++, il faut savoir
quels symboles nomment des types, et quels nomment quelque chose
d'autre. Pour les noms dépendants, pas de problème, évidemment,
mais pour les noms dépendants, la norme a pris l'option que ce
n'est pas un type, à moins qu'on dit explicitement autrement.

Dans ce cas précis, évidemment, si iterator n'est pas un type,
l'instruction est quand même légale, mais comme tu dis, en
interprétant le '*' comme multiplication. Dans le cas général,
en revanche, on aura une erreur de syntaxe.

--
James Kanze GABI Software http://www.gabi-soft.fr
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


Back to top
drkm
Guest





PostPosted: Wed Jan 26, 2005 10:51 pm    Post subject: Re: type membre d'une classe template Reply with quote

Stanislas RENAN <nomail (AT) genigraph (DOT) fr> writes:

Quote:
Gabriel Dos Reis a écrit :

Le message n'était pas une contradiction,
mais un complément d'information Smile Je remets du contexte :

et bien nous attendons que tu nous éclaires à ce propos (en tout cas,
moi).

Quelque chose n'est toujours pas clair ?

--drkm

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.