OVH Cloud OVH Cloud

conflit de nom

3 réponses
Avatar
Drakkhen
Bonjour,

J'ai besoin de nommer une fonction de classe : sqrt
et j'ai besoin d'utiliser la fonction sqrt de math.h dedans.

Je me retrouve avec un conflit de nom que je ne sais pas resoudre.

Pourriez-vous svp me dire comment faire?
merci.

3 réponses

Avatar
Anthony Fleury
Drakkhen wrote:

Bonjour,



Bonjour,

J'ai besoin de nommer une fonction de classe : sqrt
et j'ai besoin d'utiliser la fonction sqrt de math.h dedans.

Je me retrouve avec un conflit de nom que je ne sais pas resoudre.


Présenté ainsi il n'y a aucun conflit de nom. Il suffit d'utiliser
l'opérateur de résolution de portée ::.

#include <math.h>

class foo {
public:
double sqrt(double) { ::sqrt(2.0); }
};

l'operateur :: ira chercher sqrt() dans l'espace de nom global et ainsi la
fonction sqrt de foo ne s'appelera pas récursivement.

De plus, les en-têtes de la librairie standard utilisent maintenant (pour
les compilateurs qui respectent cette partie de la norme) l'espace de nom
`std' pour leurs inclusions. Donc la fonction sqrt, sauf using definition,
se retrouverai accessible par std::sqrt(2.0).

Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended

Avatar
Jean-Noël Mégoz
"Anthony Fleury" a écrit dans le message de
news:40ac7a1f$0$7707$
Drakkhen wrote:

Bonjour,



Bonjour,

J'ai besoin de nommer une fonction de classe : sqrt
et j'ai besoin d'utiliser la fonction sqrt de math.h dedans.

Je me retrouve avec un conflit de nom que je ne sais pas resoudre.


Présenté ainsi il n'y a aucun conflit de nom. Il suffit d'utiliser
l'opérateur de résolution de portée ::.

#include <math.h>

class foo {
public:
double sqrt(double) { ::sqrt(2.0); }
};

l'operateur :: ira chercher sqrt() dans l'espace de nom global et ainsi la
fonction sqrt de foo ne s'appelera pas récursivement.



J'ai du mal à saisir le caractère indispensable de nommer une fonction
"sqrt" ! ;))
Ceci dit, la réponse d'Anthony est instructive. Merci !
J.No.


Avatar
James Kanze
Anthony Fleury writes:

|> Drakkhen wrote:

|> > J'ai besoin de nommer une fonction de classe : sqrt et j'ai besoin
|> > d'utiliser la fonction sqrt de math.h dedans.

|> > Je me retrouve avec un conflit de nom que je ne sais pas resoudre.

|> Présenté ainsi il n'y a aucun conflit de nom. Il suffit
|> d'utiliser l'opérateur de résolution de portée ::.

|> #include <math.h>

|> class foo {
|> public:
|> double sqrt(double) { ::sqrt(2.0); }
|> };

|> l'operateur :: ira chercher sqrt() dans l'espace de nom global et
|> ainsi la fonction sqrt de foo ne s'appelera pas récursivement.

Attention cependant. La norme l'interdit, mais c'est assez fréquent
que les en-têtes C contient des macros à la place des fonctions.
Disons quelque chose du genre :

extern double sqrt( double ) ;
#define sqrt( d ) __builtin_sqrt( d )

J'ai déjà eu ce problème dans la passée (pas très distante,
d'ailleurs).

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