سؤال

أحاول تجميع هذا الكود:

#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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top