لماذا يعتبر التحميل الزائد مع __int64 و__int64 غير الموقعين غامضًا

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

سؤال

باستخدام VS2008، لماذا يعد هذا أمرًا جيدًا (غير مسموح باستخدام 2010).

void assert(int exp, int actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned int exp, unsigned int actual) {if (exp!=actual) printf("assert    failed\n");}

لكن هذا غامض.

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned __int64 exp, unsigned __int64 actual) {if (exp!=actual) printf("assert failed\n");}

نموذج لنص الخطأ

d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(31) : error C2668: 'assert' : ambiguous call to overloaded function
d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(12): could be 'void assert(unsigned __int64,unsigned __int64)'
d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(10): or       'void assert(__int64,__int64)'
while trying to match the argument list '(int, int)'

يصبح الأمر غامضًا فقط فيما يتعلق بالحمل الزائد "غير الموقع".وجود الإصدار "int" والإصدار "__int64" ليس أمرًا غامضًا.

هل كانت مفيدة؟

المحلول

التعليمات البرمجية الخاصة بك هو في الواقع باستخدام int و int كما المعلمات.في الحالة الأولى لها تطابق دقيق.في الحالة الثانية أنه لا، ويعامل INT-> UINT64 و Int-Int64 على حد سواء، لا يعرف أي واحد لاختيار.

نصائح أخرى

أنت تحصل على هذا لأنه int يمكن تحويلها ضمنيا إلى كليهما __int64 و unsigned __int64.

ما يلي أيضًا لا يتم تجميعه:

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned __int64 exp, unsigned __int64 actual){if (exp!=actual) printf("assert failed\n");}

int x = 0;
assert(x,x);

لكن اذا x هو من النوع __int64 تم حل الغموض.

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned __int64 exp, unsigned __int64 actual){if (exp!=actual) printf("assert failed\n");}

__int64 x = 0;
assert(x,x);\
//compiles
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top