OVH Cloud OVH Cloud

type membre d'une classe template

18 réponses
Avatar
Thierry Noc
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"

8 réponses

1 2
Avatar
Stanislas RENAN

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



Oui...

amen.


--
Stanislas RENAN


Avatar
Stanislas RENAN
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).

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

Avatar
drkm
Stanislas RENAN writes:


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


Avatar
Gabriel Dos Reis
Stanislas RENAN writes:

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

à quel propos exactement ?

-- Gaby
Avatar
Stanislas RENAN

Stanislas RENAN writes:

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

à quel propos exactement ?


il y avait un problème exposé dans le message initial de cette
discussion.
L'un des participants a montré comment résoudre le problème tout en se
posant une autre question.
J'ai proposé une réponse à cette question.
Tu as rebondi sur cette réponse et proposé un bout de code en posant une
nouvelle question.

La réponse à cette dernière m'intéresse.
Si tu peux argumenter la réponse, ce serait bien.

J'espère être resté compréhensible :)
--
Stanislas RENAN

Avatar
Gabriel Dos Reis
Stanislas RENAN writes:

|
| > Stanislas RENAN writes:
| > | > 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).
| > à quel propos exactement ?
|
| il y avait un problème exposé dans le message initial de cette
| discussion.
| L'un des participants a montré comment résoudre le problème tout en se
| posant une autre question.
| J'ai proposé une réponse à cette question.
| Tu as rebondi sur cette réponse et proposé un bout de code en posant une
| nouvelle question.
|
| La réponse à cette dernière m'intéresse.

Je crois que tout était dit dans



| Si tu peux argumenter la réponse, ce serait bien.

Je recopie :

(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 :


# | 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,
^^^^^^^^^^^^^^^^^^^^^^^

-- Gaby

Avatar
Repondre sur le NG
Stanislas RENAN writes:

|
| > Stanislas RENAN writes:
| > | > 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 t out cas,
| > | moi).
| > à quel propos exactement ?
|
| il y avait un problème exposé dans le message initial de cette
| discussion.
| L'un des participants a montré comment résoudre le problème tou t en se
| posant une autre question.
| J'ai proposé une réponse à cette question.
| Tu as rebondi sur cette réponse et proposé un bout de code en pos ant une
| nouvelle question.
|
| La réponse à cette dernière m'intéresse.

Je crois que tout était dit dans


tout dépend de l'intention de ton message.
Si c'était pour que je comprenne, alors il restait des choses à dire,
comme je l'ai exprimé.

Pour ceux qui, comme moi, ont besoin d'explications pour comprendre,
je viens de lire partiellement un document sur les changements apportés
à gcc 3.4, et notament le paragraphe concernant l'utilisation de
typename (commençant par « You must now use the typename and template
keywords to disambiguate dependent names ») :

<http://gcc.gnu.org/gcc-3.4/changes.html>

L'exemple et les commentaires sont clairs et explicitent le fait qu'un
nom dépendant est un nom dont le type dépend d'un paramètre templat e
(c'est peut-être plus compliqué, m'enfin bon) ;
un tel nom n'existe donc que dans le contexte d'une classe ou d'une
fonction template (sinon, le type n'est pas paramétrable, même s'il p eut
être paramétré, comme std::map<int, int>::iterator par exemple).

Le type d'un tel nom doit être précédé du mot-clef typename pour
expliciter le fait que le type que l'on souhaite utiliser pour le nom
est bien un type, et que l'on n'essaye pas de faire autre chose, soit :
-une multiplication dans le cas du pointeur ;
-un appel de fonction dans le cas que tu as écrit.

Il y a peut-être d'autres ambiguïtés similaires que le mot-clef
"typename" vient résoudre.

Ce que je dis est peut-être imparfait (et, dans ce cas, il est
probablement souhaitable de le corriger), mais au moins je comprends
mieux le problème et la façon dont il est résolu à la lecture du
document dont j'ai donné le lien.

--
Stanislas RENAN

Avatar
Gabriel Dos Reis
Repondre sur le NG writes:

| > Stanislas RENAN writes:
| > | | > Stanislas RENAN writes:
| > | > | > 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).
| > | > à quel propos exactement ?
| > | | il y avait un problème exposé dans le message initial de cette
| > | discussion.
| > | L'un des participants a montré comment résoudre le problème tout en se
| > | posant une autre question.
| > | J'ai proposé une réponse à cette question.
| > | Tu as rebondi sur cette réponse et proposé un bout de code en posant une
| > | nouvelle question.
| > | | La réponse à cette dernière m'intéresse.
| > Je crois que tout était dit dans
|
| tout dépend de l'intention de ton message.

Groumph.

-- Gaby
1 2