OVH Cloud OVH Cloud

itoa

7 réponses
Avatar
pasde.hcyrano.spam
bonsoir,

par quoi remplacer cette fonction, j'ai lu quelle n'etait pas portable
(Dos), vous devez avoir une routine?

de plus cette fonction est dans une methode template et je ne comprend
pas le warning :-(

warning: there are no arguments to 'itoa' that depend on a template
parameter, so a declaration of 'itoa' must be available

merci


--
Bruno Causse
http://perso.wanadoo.fr/othello

7 réponses

Avatar
Fabien LE LEZ
On Thu, 19 Jan 2006 21:29:12 +0100, (Bruno
Causse):

Subject: itoa

par quoi remplacer cette fonction


Section 27.1 de la FAQ.
http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/

there are no arguments to 'itoa' that depend on a template
parameter, so a declaration of 'itoa' must be available


Le compilateur a rencontré l'appel à une fonction "itoa" qui n'existe
pas. Typiquement, tu as oublié un #include quelque part.

Mais j'admets que le message d'erreur n'est pas très explicite.

Avatar
Jean-Marc Bourguet
(Bruno Causse) writes:

bonsoir,

par quoi remplacer cette fonction, j'ai lu quelle n'etait pas portable
(Dos), vous devez avoir une routine?


stringstream

de plus cette fonction est dans une methode template et je ne comprend
pas le warning :-(

warning: there are no arguments to 'itoa' that depend on a template
parameter, so a declaration of 'itoa' must be available


Comme il n'y a aucun argument de itoa qui dépend d'un
paramètre template, une déclaration de itoa doit être
disponible. Seuls les noms qui dépendent d'un paramètre
template sont cherchés dans le contexte d'instantiation, les
autres ne sont cherchés que dans le contexte de définition
du template. C'était aussi la source de ton autre problème:
TMsgJoin ne dépendait pas d'un paramètre template dont il
fallait une définition disponible; comme la définition en
fait dépendait d'un paramètre template, j'ai rendu ce fait
explicite.

Je crains être confu. Reprenons à partir du début.

Dans un template quand on trouve un nom, il faut chercher
une définition (si elle ne se trouve pas dans le template
bien sûr). On peut les chercher à deux endroits: soit dans
le contexte de la définition du template, soit dans le
contexte de l'instantiation du template.

Certains noms sont indépendants des paramètres
templates, c'est à dire que rien dans leur utilisation
dépend des paramètres templates. C'était le cas de
TMsgJoin, c'est aussi le cas d'un appel:
f(e1, e2);
si e1 et e2 n'ont pas des types qui dépendent d'un paramètre
template. Ces noms sont cherchés uniquement dans le
contexte de la définition du template.

D'autres noms sont dépendants d'un ou plusieurs paramètres
templates. Par exemple si un des arguments d'une fonction a
pour type un paramètre template. Ces noms sont cherchés
aussi dans le contexte d'instantiation.

Quelque chose de particulier: si une classe template dérive
d'un paramètre template, les noms non qualifiés ne seront
pas cherchés dans cette classe de base (c'est pourquoi
TMsgJoin n'était pas trouvé). Il faut alors rendre ces noms
dépendants. Pour les membres non types, c'est facile on
utilise this->.

La règle de ne pas recherché les noms indépendants hors du
contexte de définition a été implémentées par gcc qu'à
partir de 3.4 me semble-t'il.

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
Gabriel Dos Reis
Fabien LE LEZ writes:

| On Thu, 19 Jan 2006 21:29:12 +0100, (Bruno
| Causse):
|
| >Subject: itoa
|
| >par quoi remplacer cette fonction
|
| Section 27.1 de la FAQ.
| http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/
|
| >there are no arguments to 'itoa' that depend on a template
| >parameter, so a declaration of 'itoa' must be available
|
| Le compilateur a rencontré l'appel à une fonction "itoa" qui n'existe
| pas. Typiquement, tu as oublié un #include quelque part.
|
| Mais j'admets que le message d'erreur n'est pas très explicite.

Indeed.
Le message d'erreur a été ajouté dans la transition à 3.4.x où la
recherche de nom en deux phases a été pour la première fois
implémentée dans GCC. Le compilateur essaie de dire qu'il n'y a pas de
déclaration de itoa -- durant la première phase de recherche de nom --
et donc qu'il ne peut pas le prendre comme un nom dépendant (qu'il
chercherait dans la seconde phase.) En conséquence, il demande une
déclaration de "itoa".

-- Gaby
Avatar
Marc Duflot
Jean-Marc Bourguet wrote:
(Bruno Causse) writes:


bonsoir,

par quoi remplacer cette fonction, j'ai lu quelle n'etait pas portable
(Dos), vous devez avoir une routine?



stringstream


Voir aussi lexical_cast de boost.


Avatar
Gabriel Dos Reis
Marc Duflot writes:

| Jean-Marc Bourguet wrote:
| > (Bruno Causse) writes:
| >
| >
| >>bonsoir,
| >>
| >>par quoi remplacer cette fonction, j'ai lu quelle n'etait pas portable
| >>(Dos), vous devez avoir une routine?
| >
| >
| > stringstream
|
| Voir aussi lexical_cast de boost.

quit fait penser qu'on fait un cast...

-- gaby
Avatar
Bruno CAUSSE
dans l'article , Jean-Marc Bourguet à
a écrit le 19/01/06 21:47 :

(Bruno Causse) writes:

bonsoir,

par quoi remplacer cette fonction, j'ai lu quelle n'etait pas portable
(Dos), vous devez avoir une routine?


stringstream

de plus cette fonction est dans une methode template et je ne comprend
pas le warning :-(

warning: there are no arguments to 'itoa' that depend on a template
parameter, so a declaration of 'itoa' must be available


Comme il n'y a aucun argument de itoa qui dépend d'un
paramètre template, une déclaration de itoa doit être
disponible. Seuls les noms qui dépendent d'un paramètre
template sont cherchés dans le contexte d'instantiation, les
autres ne sont cherchés que dans le contexte de définition
du template. C'était aussi la source de ton autre problème:
TMsgJoin ne dépendait pas d'un paramètre template dont il
fallait une définition disponible; comme la définition en
fait dépendait d'un paramètre template, j'ai rendu ce fait
explicite.

Je crains être confu. Reprenons à partir du début.

Dans un template quand on trouve un nom, il faut chercher
une définition (si elle ne se trouve pas dans le template
bien sûr). On peut les chercher à deux endroits: soit dans
le contexte de la définition du template, soit dans le
contexte de l'instantiation du template.

Certains noms sont indépendants des paramètres
templates, c'est à dire que rien dans leur utilisation
dépend des paramètres templates. C'était le cas de
TMsgJoin, c'est aussi le cas d'un appel:
f(e1, e2);
si e1 et e2 n'ont pas des types qui dépendent d'un paramètre
template. Ces noms sont cherchés uniquement dans le
contexte de la définition du template.

D'autres noms sont dépendants d'un ou plusieurs paramètres
templates. Par exemple si un des arguments d'une fonction a
pour type un paramètre template. Ces noms sont cherchés
aussi dans le contexte d'instantiation.

Quelque chose de particulier: si une classe template dérive
d'un paramètre template, les noms non qualifiés ne seront
pas cherchés dans cette classe de base (c'est pourquoi
TMsgJoin n'était pas trouvé). Il faut alors rendre ces noms
dépendants. Pour les membres non types, c'est facile on
utilise this->.

La règle de ne pas recherché les noms indépendants hors du
contexte de définition a été implémentées par gcc qu'à
partir de 3.4 me semble-t'il.

A+


J'ai encore bcq de mal a suivre (mais je m'accroche), ca compile sans
warning (gcc 4.01) :-).

Mercis a tous


Avatar
Jean-Marc Bourguet
Bruno CAUSSE writes:

J'ai encore bcq de mal a suivre (mais je m'accroche), ca compile sans
warning (gcc 4.01) :-).


J'ai pas le sentiment d'avoir ete tres clair :-(

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