 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Thierry Noc Guest
|
Posted: Mon Jan 24, 2005 2:35 pm Post subject: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 2:42 pm Post subject: Re: type membre d'une classe template |
|
|
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; |
(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
|
Posted: Mon Jan 24, 2005 3:54 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 4:49 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 8:02 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 8:06 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 8:18 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 8:19 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 8:23 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Mon Jan 24, 2005 8:28 pm Post subject: Re: type membre d'une classe template |
|
|
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 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
|
Posted: Mon Jan 24, 2005 9:44 pm Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Tue Jan 25, 2005 9:06 am Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Tue Jan 25, 2005 9:14 am Post subject: Re: type membre d'une classe template |
|
|
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  |
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 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
|
Posted: Wed Jan 26, 2005 9:37 am Post subject: Re: type membre d'une classe template |
|
|
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
|
Posted: Wed Jan 26, 2005 10:51 pm Post subject: Re: type membre d'une classe template |
|
|
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 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 |
|
 |
|
|
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
|
|