فلنفترض وجود الفئه التاليه:
struct int64
{
long long value;
int64() : value(0) {}
int64(signed char i8) : value(i8) {}
int64(unsigned char u8) : value(u8) {}
int64(short i16) : value(i16) {}
int64(unsigned short u16) : value(u16) {}
int64(int i32) : value(i32) {}
int64(unsigned u32) : value(u32) {}
int64(long long i64) : value(i64) {}
int64(unsigned long long u64) : value(u64) {}
int64(const int64& i64) : value(i64.value) {}
int64& operator+=(const int64& rhs) { return value += rhs.value, *this; }
int64& operator-=(const int64& rhs) { return value -= rhs.value, *this; }
friend int64 operator+(const int64& lhs, const int64& rhs) { return int64(lhs) += rhs; }
friend int64 operator-(const int64& lhs, const int64& rhs) { return int64(lhs) -= rhs; }
};الفئه int64 ستعمل دون مشاكل و الكود التالي سبعمل دون مشاكل:
int64 q = 500; int64 m = q + 1024;
إذا اردنا تحويل النوع int64 إلى أى من الأنواع الأساسيه سنحتاج لإضافة الكود التالي:
operator char() const { return (char)value; }
operator short() const { return (short)value; }
operator int() const { return (int)value; }
operator long long() const { return value; }و لكن عند الترجمه ستظهر لنا خطأ فى السطر الثاني من كود الإختبار و هو انه للرقم 1024 توجد 5 تحويلات 4 منهم خاصه بكل معامل قمنا بإضافته و الأخير خاص بالـ conversion operator بالفئه int64.
للتحايل على هذه المشكله، قمت بحذف كود التحويل و إستخدام الـ template عوضا عنه:
template <typename n>
operator n() const { return (n)value; }هذا الكود يعمل بشكل ممتاز و دون مشاكل مع مترجم VC++ و مترجم GCC و لكن مترجم Intel لازال يظهر نفس المشكله، فهل توجد لديك وسيله اخرى بخلاف المذكورين؟
و الله ولي التوفيق