سؤال
أحاول تجميع هذا الكود:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
لكن مجلس التعاون الخليجي يقول لي:
error: 'round' is not a member of 'std'
أعلم أنني استخدمت round
وظيفة عدة مرات في ايزو سي++98 قبل.على نحو غير عادي، round
و ::round
كلا العملين.
ما يعطي؟
تحديث:كنت أجمع مع g++ -std=c++98 -Wall -pedantic
.التبديل إلى std=c++0x
يعمل.
ولكن لماذا يفعل غير المؤهلين/المجهول round
و ::round
كلاهما يعمل إذا std::round
لا؟
المحلول
ال std::round
الوظائف هي C++ 11، لذا ستحتاج إلى الترجمة باستخدام C++ 11 أو تمكين معيار أحدث.
نصائح أخرى
لقد فعلت قليلا من البحث ، وإليك ما وجدت:
round
ويعرف في ISO C++11, كما أنه يحتوي على ISO C99 مكتبة القياسية.
round
ليست جزءا من ISO C++98, الذي يستخدم ISO C90 مكتبة القياسية.
هذا هو السبب في أنه ليس في مساحة الاسم std
بالنسبة C++98.
ولكن g++
هو (غير صحيح) بما في ذلك C99 رؤوس ، حتى عندما جمعت مع -std=c++98 -pedantic
, التي يجب تعطيل جميع غير القياسية الاشياء:
GNU_SOURCE يحددها G++ و ...يعني _USE_ISOC99
(من http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
هذا هو السبب ::round
يعمل.
هذا على ما يبدو هو خلل في دول مجلس التعاون الخليجي: لماذا دول مجلس التعاون الخليجي السماح باستخدام الجولة() في C++ حتى مع ansi و متحذلق الأعلام ؟
Compilers C++ الأخرى قد لا توفر round
وظيفة (لأنها ليست المطلوبة من قبل معيار) ، لذا يجب أن تحدد بلدي.
ماذا عن
giveacodicetagpre.بهذه الطريقة لا توجد مقارنة وسوف تكون جولة بشكل صحيح.
الموضوع القديم ولكن ربما تكون مفيدة لتلك التي تبحث في Google:
giveacodicetagpre.في معيار C++03، المرجع المعياري لـ مكتبة C القياسية هي ISO/IEC 9899:1990 (C90). لا تشمل round
وظيفة.في C++ 11، فهي ISO/IEC 9899:1999 (C99)، والتي يفعل تشمل round
وظيفة.
محتويات <cmath>
في كل معيار C++ هي نفسها math.h
من مكتبة C القياسية المقابلة باستثناء بعض التغييرات (§26.8/4 في C++ 11):
محتويات هذه العناوين [
<cmath>
و<cstdlib>
] هي نفس رؤوس مكتبة Standard C<math.h>
و<stdlib.h>
على التوالى [...]
ومع ذلك، فهي في نطاق مساحة الاسم std
(§17.6.1.2/4 في C++ 11):
ومع ذلك، في مكتبة C++ القياسية، تكون الإعلانات (باستثناء الأسماء التي تم تعريفها كوحدات ماكرو في C) ضمن نطاق مساحة الاسم (3.3.6) لمساحة الاسم std.
لذلك، لاختتام الأمر، round
الوظيفة غير متوفرة في C++ 03، لذا قم بالتجميع باستخدام -std=c++0x
الخيار والإشارة إليه باسم std::round
.