لم البصرية ستوديو 2008 مترجم autocast لمضاعفة مع الجذر التربيعي في C ++؟

StackOverflow https://stackoverflow.com/questions/2452510

  •  20-09-2019
  •  | 
  •  

سؤال

لا يجب على المترجم يلقي تلقائيا إلى ضعف في ما يلي؟ على الأقل وفقا لوالتر سافيتش.

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) << endl;
    return 0;
}//error C2668: 'sqrt' : ambiguous call to overloaded function
//Visual Studio 2008 on Win Vista
هل كانت مفيدة؟

المحلول

والمشكلة هي أن هناك ثلاثة إصدارات sqrt للاختيار من بينها:

     double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );

ومنذ كنت تمر في int، والمترجم هو الذهاب الى تعزيز حجتك إلا أنها صالحة أيضا لتعزيز صحيحا على أي من أنواع المذكورة أعلاه، لذلك فمن غامضة.

ويمكنك إصلاح هذا ببساطة عن طريق الصب صراحة إلى أحد أنواع المذكورة أعلاه، كما في:

cout << "The square root of k is: " << sqrt((double)k) << endl;

نصائح أخرى

والخطأ نداء غامض هو أنه لا يعرف أي وظيفة الدعوة لا أن ذلك لا يحول ضمنيا.

ونظرة على ما يلي: إذا أنا خلق وظيفة بلدي أن يأخذ ضعف وإرجاع مزدوج انه ليس لديها قضية تحويل ضمنيا. منذ صحيحا بك يمكن تحويلها إلى أي من ثلاثة الزائدة أنها لا تعرف ما لاستدعاء.

double mysqrt(double d)
{
   return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//Works Fine

ولكن إذا أضيف نسخة أخرى من mysqrt أن يأخذ تعويم يمكنني إنشاء الخطأ دعوة غامضة.

double mysqrt(float f)
{
    return f;
}
double mysqrt(double d)
{
    return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//error C2668: 'mysqrt' : ambiguous call to overloaded function

وبما أن هناك عدة الجذر التربيعي وظائف (الزائدة) وأكثر من 1 يمكن أن يقبل عدد صحيح كمعلمة دون فقدان الدقة والأمر متروك لكم لتحديد أي (وهذا أمر جيد لأنك لا تريد مترجم اتخاذ القرارات بالنسبة لك بناء على الأدلة "ظرفية" - تمرير عدد صحيح إلى الجذر التربيعي ).

وC دوما بإرجاع النسخة مزدوج ما لم يسمى sqrtf.

وحاول صب مكالمتك مع (مزدوجة)

ومن MSDN: [

double sqrt(
   double x 
);
float sqrt(
   float x 
);  // C++ only
long double sqrt(
   long double x
);  // C++ only
float sqrtf(
   float x 
);

و] 1

وهناك عدة الزائدة إلى الأمراض المنقولة جنسيا :: الجذر التربيعي في cmath. واحد يأخذ تعويم وآخر يأخذ ضعف. المترجم لا يمكن أن تعرف ما تريد أن يطلق عليه، ويمكن أن يلقي [إينتس] إلى أي منها.

في غياب الزائدة إضافية، فإنه يلقي تلقائيا إلى ضعف [هذا هو الحال في C] كما هو متوقع.

نعم، ويجب أن يلقي تلقائيا من كثافة العمليات إلى الضعف. ز ++ بتجميع هذه الغرامة لذا أعتقد VS من الخطأ

وتحرير: لست متأكدا لماذا مو الجواب هو أسفل صوت. ولكن أعتقد خلال وظيفة الحمولة الزائدة في ج ++، يجب التحويل التلقائي يحدث دائما إلى أعلى نوع البيانات في تحويل السيارات غير ممكن. لالسابقين: إذا كان هناك خيار لتحويل من داخل لفترة طويلة، وتعويم مزدوجة، ينبغي دائما يفعل عدد صحيح إلى تحويل مزدوجة

.

وحاولت في هذا ز ++ وتدعو وظيفة الجذر التربيعي (مزدوجة).

#include <iostream>
#include <cmath>
#include <typeinfo>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) <<' '<<  typeid(sqrt(k)).name()<< endl;
    return 0;
}

وهكذا خرج typeid () هو "د" الذي الوسائل فعلت لتحويل السيارات من كثافة مضاعفة.

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