Ошибка: 'log2' не является членом 'std'
Я не уверен, что я вижу здесь. Приведенные ниже результаты теста взяты из старого PowerMac G5 под управлением OS X 10.5.8. Он все еще для тестирования под процессором PowerPC с прямым порядком байтов. Компилятор GCC 5.4, и он предоставляется MacPorts.
Тестовая программа ниже. Компиляция приводит к ошибке 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;
}
Согласно std::log2() расширение или стандарт C++?, std::log2
должен быть доступен.
Почему программа не компилируется?
$ /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 );
^
Это может быть связано со старым оборудованием: функции Cmath C++11 не находятся в пространстве имен std для Android NDK w/gcc-4.8 или clang 3.4. Я понимаю, что Android - это другая платформа.
Теперь откройте в трекере проблем MacPorts: проблема 53226: PowerMac, GCC 5.4 и "ошибка:"std::log2 "не был объявлен".
Теперь откройте в трекере проблем GCC: Проблема 79017: Старый PowerMac G5, MacPorts GCC 5.4, C++11 и "std:: log2 не был объявлен"
1 ответ
Почему программа не компилируется?
Отчет GCC в выпуске 79017: Старый PowerMac G5, MacPorts GCC 5.4, C++11 и "std::log2 не был объявлен" получили хорошие отзывы от разработчиков GCC.
По словам Джонатана Уэйкли и результатов программы ниже:
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);
Поскольку эти шесть функций отсутствуют, мы рассматриваем все математические функции C99 как отсутствующие. Мы могли бы разделить проверки на две части, поэтому мы проверяем их отдельно, что позволит импортировать остальную часть математической библиотеки C99 в пространство имен 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;
}