c ++ ошибка gcc: «sqrtl» не является членом «std» - PullRequest
2 голосов
/ 02 октября 2019

Когда я пытаюсь скомпилировать следующую программу, компилятор выдает error: 'sqrtl' is not a member of 'std'.

#include <cmath>
#include <iostream>
int main(){
    std::cout << std::sqrtl(5.0) << "\n";
    return 0;
}

Я хотел знать, почему это происходит, поэтому я начал экспериментировать.

Когда я удаляюstd:: перед sqrtl программа компилируется и работает нормально. Когда я дополнительно удаляю #include <cmath>, компилятор выдает error: 'sqrtl' was not declared in this scope.

В этот момент я действительно запутался. Очевидно, в cmath должна быть функция sqrtl, но она не является членом std?

Когда я заменяю sqrtl на sqrt в исходной программе, программа компилируетсяи работает нормально. То же самое, когда я удаляю std:: перед sqrt. Когда я дополнительно удаляю #include <cmath>, компилятор выдает error: 'sqrt' was not declared in this scope.

Наконец, я проделал тот же тест с sqrtf. Произошло то же самое, что и с sqrtl.

Еще одна вещь, которую я нахожу странной, заключается в том, что удаление std:: позволяет компилировать программу в первую очередь. Особенно с sqrt, который должен быть членом std, иначе компилятор выдал бы ту же ошибку, что и sqrtl и sqrtf. Это особенно сбивает с толку, поскольку удаление std:: перед cout заставляет компилятор дать мне error: 'cout' was not declared in this scope.

Может кто-нибудь объяснить, почему sqrtl, sqrt и sqrtf ведут себя так странно? Является ли sqrt даже членом std? Как я могу узнать, является ли определенный метод членом std или нет?

Я знаю, что удаление std:: - это простое исправление, но для целей согласованности мне нравится иметь std:: передвсе std пользователей в моей личной библиотеке.

1 Ответ

5 голосов
/ 02 октября 2019

Это ошибка. Per [cmath.syn] sqrtl является членом пространства имен std.

namespace std {
      [...]
      float sqrt(float x);  // see [library.c]
      double sqrt(double x);
      long double sqrt(long double x);  // see [library.c]
      float sqrtf(float x);
      long double sqrtl(long double x);
      [...]
}

Это юридический код, который будет компилироваться в MSVS и Clang .

Существует отчет об ошибке в GCC , но об этом еще не позаботились, поскольку он очень тривиален и их ресурсы конечны.

...