2013-05-13 9 views
7

ich mein Programm in Linux kompilieren - es die folgende Zeile hat:‚sqrt‘ ist kein Mitglied von ‚std‘

std::sqrt((double)num); 

Auf Windows ist es in Ordnung, aber auf Linux Ich werde ‚sqrt‘ nicht ein Mitglied von 'Std' Ich habe ein Include für math.h

Was ist ein Problem damit?

+3

Haben Sie '' eingeschlossen? – juanchopanza

+1

'#include ', entsprechend http://en.cppreference.com/w/cpp/numeric/math/sqrt – hmjd

Antwort

14

Ändern Sie die Direktive in #include <cmath>. C++ - Header des Formulars <cxxxxxxx> haben garantiert die Standardnamen im Namespace std (und können sie optional im globalen Namespace bereitstellen). <xxxxxx.h> sind nicht.

+0

'garantiert, um die Standardnamen im std Namensraum zu haben' vor 'C++ 11'. Natürlich war der Grund, dass für 11 entspannt war, dass einige Implementierungen nie belästigt wurden. – BoBTFish

+4

@BoBTFish Es ist immer noch garantiert, die Standardnamen im 'std'-Namespace zu haben. Vor C++ 11 war es auch garantiert _nicht_, sie im globalen Namespace zu haben. C++ 11 ermöglicht es ihnen auch im globalen Namensraum zu sein, da dies die am weitesten verbreitete Praxis war. –

+1

@BoBTFish Was JamesKanze sagte, siehe 17.6.1.2/4. – jrok

2

ist es einfach, weil <math.h> die Funktionen in namespace std nicht deklariert. Es wurde nur aus Kompatibilitätsgründen in den C++ - Standard aufgenommen. Das korrekte C++ - Include wäre <cmath>.

§D.5,2

Jeder C-Header, von denen jeder einen Namen der folgenden Form besitzt name.h verhält sich, als ob jeder Name in der Standardbibliothek Namensraum durch die entsprechende cname Header platziert innerhalb des globalen Namespace-Bereichs platziert. Es ist nicht angegeben, ob diese Namen zuerst im Namensraumbereich des Namensbereichs std deklariert oder definiert werden und dann durch explizite using-declarations in den globalen Namensraumbereich injiziert werden.

Dass Ihr Code unter Windows funktioniert hat, war pures Glück - wenn Sie es so nennen wollen. Der letzte Satz gibt einen Hinweis, was unter Windows passieren könnte, aber nicht unter Linux: Unter Windows sind die Namen natürlich sowohl im globalen Namespace als auch im Namespace std gültig.

+0

'' ist Teil von Standard C, als "Kompatibilitätsmerkmal". Es gibt tatsächlich gute Gründe, es zumindest in bestimmten Fällen vorzuziehen. Natürlich deklariert es ':: sqrt' und nicht' std :: sqrt'. –

+0

@JamesKanze danke für die Korrektur, das war mir nicht bewusst. Ich habe meine Antwort geändert. –