web-dev-qa-db-fra.com

'sqrt' n'est pas membre de "std"

Je compile mon programme de Linux - il a la ligne suivante:

std::sqrt((double)num);

Sur Windows, c'est ok, mais sur Linux, je reçois 'sqrt' n'est pas membre de "std" que j'ai une notamment pour Math.h

quel est un problème avec ça?

17
Yakov

Changer la directive à #include <cmath>. C++ en-têtes de la forme <cxxxxxxx> Sont garantissant que les noms standard dans std Espace de noms (et peuvent s'accepter de les fournir à l'espace de noms global). <xxxxxx.h> ne sont pas.

25
jrok

c'est simplement parce que <math.h> ne déclare pas les fonctions de namespace std. Il a été inclus dans la norme C++ uniquement pour des raisons de compatibilité. Le C++ correct inclure serait <cmath>.

§.5,2

Chaque en-tête C, dont chacun a un nom de la forme name.h, se comporte comme si chaque nom placé dans l'espace de noms de la bibliothèque standard par l'en-tête correspondant cname est placé dans la portée de l'espace de noms global. Il est indéterminé si ces noms sont déclarés d'abord déclarés ou définis dans la portée de l'espace de noms de l'espace de noms std et sont ensuite injectés dans la portée des espaces de noms globaux par Explicit Utilisation des déclarations.

Que votre code travaillé sous Windows était pure chance - si vous voulez l'appeler ainsi. La dernière phrase donne un indice ce qui pourrait arriver sous Windows, mais pas sous Linux: sous Windows, évidemment, les noms sont valides dans l'espace de noms global et l'espace de noms std.

5
Arne Mertz