Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme avec std::abs

3 réponses
Avatar
Aurélien REGAT-BARREL
Bonjour,
Je ne comprend pas pourquoi le code suivant échoue à la compilation avec
VC++ 7.1 sur l'appel de f :

void f( float )
{
}

void f( double )
{
}

int main()
{
double d = 0.0;
f( std::abs( d ) );
}

main.cpp: error C2668: 'f' : appel ambigu à une fonction surchargée
main.cpp: peut être 'void f(double)'
main.cpp: ou 'void f(float)'
lors de la tentative de mise en correspondance de la liste des arguments
'(int)'
main.cpp: warning C4244: 'argument' : conversion de 'double' en 'int', perte
possible de données

Si je fais :
double d = std::abs( 0.0 );
f( d );

J'ai droit au warning.
Pourquoi std::abs( double ) renvoie un int ?
Merci de votre aide.

--
Aurélien REGAT-BARREL

3 réponses

Avatar
Falk Tannhäuser
Bonjour,

"int std::abs(int)" et "long std::abs(long)" sont déclarés
dans l'en-tête <cstdlib> (§ 26.5/3-4), mais les surcharges
pour "float", "double" et "long double" se trouvent dans
<cmath> (§ 26.5/6).

Falk
Avatar
Aurélien REGAT-BARREL
Oups j'ai rien dit.
Je n'avais pas inclu <cmath>. Je ne sais pas où il trouvait le std::abs
qu'il utilisait...

--
Aurélien REGAT-BARREL
Avatar
Jean-Marc Bourguet
Falk Tannhäuser writes:

"int std::abs(int)" et "long std::abs(long)" sont déclarés
dans l'en-tête <cstdlib> (§ 26.5/3-4), mais les surcharges
pour "float", "double" et "long double" se trouvent dans
<cmath> (§ 26.5/6).


Une des absurdites favorites de Gaby. Il faut declarer les surcharges
ensembles ou alors avec la definition d'un des types surcharges (ce
peut poser probleme quand on se met a declarer des types).

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