Когда я пытаюсь скомпилировать следующую программу, компилятор выдает 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
пользователей в моей личной библиотеке.