acosl не находится в пространстве имен std? - PullRequest
8 голосов
/ 09 марта 2020

Согласно cppreference, функция acosl должна находиться в пространстве имен std: https://en.cppreference.com/w/cpp/numeric/math/acos

Однако, с g cc (или clang), приведенный ниже код делает не компилируется:

#include <cmath>                                                                 

int main()                                                                       
{                                                                                
        long double var = std::acosl(4.0);                                      
        return 0;                                                                
}

Я получаю следующее сообщение об ошибке:

gay@latitude-7490:~$ g++ -std=c++11 test.cpp
test.cpp: In function 'int main()':
test.cpp:5:26: error: 'acosl' is not a member of 'std'; did you mean 'acosh'?
    5 |  long double truc = std::acosl( (long double)4.0);
      |                          ^~~~~
      |                          acosh

Чего мне не хватает? Я неправильно читаю cppreference?

1 Ответ

4 голосов
/ 09 марта 2020

Кажется, это ошибка libstdc ++.

cmath в libstdc ++ не просто переносит #include <math.h> в namespace std: она определяет новые функции, которые делегируются встроенным модулям. Я думаю, что определение хочет добавить к этот исходный код . Вероятно, это было просто упущением, когда C ++ 11 (через C99) представил эту функцию. (Хотя обратите внимание, что перегрузка acos(long double __x) делегирует __builtin_acosl!)

В Clang переключение на libc ++ решает проблему. С libstdc ++ также должна работать глобальная версия пространства имен acosl.

Вы должны поднять ошибку . Я думаю, что она покрыта bug # 79700 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...