error: 'log2' is not a member of 'std'

ⅰ亾dé卋堺 提交于 2019-12-08 03:30:10

问题


I'm not sure what I am seeing here. The test results below are from an old PowerMac G5 running OS X 10.5.8. Its still around for testing under the big-endian PowerPC cpu. The compiler is GCC 5.4, and its provided by MacPorts.

The test program is below. Compiling it results in an error error: 'log2' is not a member of 'std'.

$ cat test.cxx
#include <cmath>
int main(int argc, char* argv[])
{
    double d = std::log2(2.3456789f);
    return 0;
}

According to Is std::log2() an extension or C++ standard?, std::log2 should be available.

Why is the program failing to compile?


$ /opt/local/bin/g++-mp-5 --version
g++-mp-5 (MacPorts gcc5 5.4.0_0) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.

$ /opt/local/bin/g++-mp-5 -std=c++11 test.cxx -o test.exe
test.cxx: In function 'int main(int, char**)':
test.cxx:4:16: error: 'log2' is not a member of 'std'
     double d = std::log2(2.3456789f);
                ^
test.cxx:4:16: note: suggested alternative:
In file included from /usr/include/math.h:26:0,
                 from /opt/local/include/gcc5/c++/cmath:44,
                 from test.cxx:1:
/usr/include/architecture/ppc/math.h:431:15: note:   'log2'
 extern double log2( double );
               ^

This may be related because of the old hardware: C++11 cmath functions not in std namespace for android NDK w/gcc-4.8 or clang 3.4. I realize Android is a different platform.


Now open in the MacPorts issue tracker: Issue 53226: PowerMac, GCC 5.4 and "error: 'std::log2' has not been declared".

Now open in the GCC issue tracker: Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared"


回答1:


Why is the program failing to compile?

The GCC report at Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared" got some good comments from the GCC devs.

According to Jonathan Wakely and the results of the program below:

test.cxx:53:21: error: 'llrint' was not declared in this scope
llrint(0.0);

test.cxx:54:23: error: 'llrintf' was not declared in this scope
llrintf(0.0f);

test.cxx:55:23: error: 'llrintl' was not declared in this scope
llrintl(0.0l);

test.cxx:56:22: error: 'llround' was not declared in this scope
llround(0.0);

test.cxx:57:24: error: 'llroundf' was not declared in this scope
llroundf(0.0f);

test.cxx:58:24: error: 'llroundl' was not declared in this scope
llroundl(0.0l);   

Because these six functions are missing we treat all C99 math functions as missing. We could split the checks into two pieces, so we check for these separately, which would allow the rest of the C99 math library to be imported into namespace std.


#include <math.h>
int main() {
          typedef double_t  my_double_t;
          typedef float_t   my_float_t;
          acosh(0.0);
          acoshf(0.0f);
          acoshl(0.0l);
          asinh(0.0);
          asinhf(0.0f);
          asinhl(0.0l);
          atanh(0.0);
          atanhf(0.0f);
          atanhl(0.0l);
          cbrt(0.0);
          cbrtf(0.0f);
          cbrtl(0.0l);
          copysign(0.0, 0.0);
          copysignf(0.0f, 0.0f);
          copysignl(0.0l, 0.0l);
          erf(0.0);
          erff(0.0f);
          erfl(0.0l);
          erfc(0.0);
          erfcf(0.0f);
          erfcl(0.0l);
          exp2(0.0);
          exp2f(0.0f);
          exp2l(0.0l);
          expm1(0.0);
          expm1f(0.0f);
          expm1l(0.0l);
          fdim(0.0, 0.0);
          fdimf(0.0f, 0.0f);
          fdiml(0.0l, 0.0l);
          fma(0.0, 0.0, 0.0);
          fmaf(0.0f, 0.0f, 0.0f);
          fmal(0.0l, 0.0l, 0.0l);
          fmax(0.0, 0.0);
          fmaxf(0.0f, 0.0f);
          fmaxl(0.0l, 0.0l);
          fmin(0.0, 0.0);
          fminf(0.0f, 0.0f);
          fminl(0.0l, 0.0l);
          hypot(0.0, 0.0);
          hypotf(0.0f, 0.0f);
          hypotl(0.0l, 0.0l);
          ilogb(0.0);
          ilogbf(0.0f);
          ilogbl(0.0l);
          lgamma(0.0);
          lgammaf(0.0f);
          lgammal(0.0l);
          llrint(0.0);
          llrintf(0.0f);
          llrintl(0.0l);
          llround(0.0);
          llroundf(0.0f);
          llroundl(0.0l);
          log1p(0.0);
          log1pf(0.0f);
          log1pl(0.0l);
          log2(0.0);
          log2f(0.0f);
          log2l(0.0l);
          logb(0.0);
          logbf(0.0f);
          logbl(0.0l);
          lrint(0.0);
          lrintf(0.0f);
          lrintl(0.0l);
          lround(0.0);
          lroundf(0.0f);
          lroundl(0.0l);
          nan(0);
          nanf(0);
          nanl(0);
          nearbyint(0.0);
          nearbyintf(0.0f);
          nearbyintl(0.0l);
          nextafter(0.0, 0.0);
          nextafterf(0.0f, 0.0f);
          nextafterl(0.0l, 0.0l);
          nexttoward(0.0, 0.0);
          nexttowardf(0.0f, 0.0f);
          nexttowardl(0.0l, 0.0l);
          remainder(0.0, 0.0);
          remainderf(0.0f, 0.0f);
          remainderl(0.0l, 0.0l);
          remquo(0.0, 0.0, 0);
          remquof(0.0f, 0.0f, 0);
          remquol(0.0l, 0.0l, 0);
          rint(0.0);
          rintf(0.0f);
          rintl(0.0l);
          round(0.0);
          roundf(0.0f);
          roundl(0.0l);
          scalbln(0.0, 0l);
          scalblnf(0.0f, 0l);
          scalblnl(0.0l, 0l);
          scalbn(0.0, 0);
          scalbnf(0.0f, 0);
          scalbnl(0.0l, 0);
          tgamma(0.0);
          tgammaf(0.0f);
          tgammal(0.0l);
          trunc(0.0);
          truncf(0.0f);
          truncl(0.0l);
          return 0;
}


来源:https://stackoverflow.com/questions/41497524/error-log2-is-not-a-member-of-std

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!