acoslはstd名前空間にありませんか?


8

cppreferenceによると、関数acoslはstd名前空間にある必要があります:https : //en.cppreference.com/w/cpp/numeric/math/acos

ただし、gcc(または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を誤解していますか?


GCCのどのバージョンですか?うーん、GCC 4.9.2で
CoryKramer

@CoryKramer 9.2とtruncが失敗します。成功acoslせずstd::
Ted Lyngmo

1
私は何が起こっているのかわからないんだけど、両方acosl(4.0)std::acos(4.0l)仕事をします。また、追加-stdlib=libc++するstd::acosl(4.0)とClangで機能します。
HolyBlackCat

2
これはGCCの問題か、少なくともlibstdc ++の問題だと思います。libc ++を使用するここの clang コードは正常に動作します
NathanOliver

回答:


4

これはlibstdc ++のバグのようです。

cmathlibstdc ++にだけラップしない#include <math.h>namespace std:それは新しい関数を定義する組み込み関数へのデリゲートいます。定義がこのソースコードに追加したいと思う。C ++ 11(C99経由)が関数を導入したとき、それはおそらく見落としでした。(ただし、acos(long double __x)オーバーロードが__builtin_acosl!に委任することに注意してください。)

Clangでは、libc ++に切り替えると問題が解決します。libstdc ++では、のグローバル名前空間バージョンの使用acoslも機能するはずです。

バグを報告する必要があります。バグ#79700でカバーされていると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.