假設我們有下面的代碼:不止一個運營商,這些操作數相匹配
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; }
operator char() const { return (char)value; }
operator short() const { return (short)value; }
operator int() const { return (int)value; }
operator long long() const { return value; }
};
編譯時的這段代碼:發生
int64 q = 500;
int64 m = q + 1024;
錯誤有4類似的轉換提供給1024
和一個因對於q
爲整型,爲了解決這個問題,我從int64
中刪除了operator XX
,並添加了以下代碼:
template <typename n>
operator n() const { return (n)value; }
現在我可以執行以下代碼:
int64 q = 500;
int64 m = q + 1024;
short r = q;
模板定義可與Visual C++
和GCC
編譯器,但Intel C++
編譯器。
我該如何編寫適用於這些編譯器的轉換運算符?
編譯器生成的問題出了什麼問題? –
@你不會放棄生成的編譯器(至少是copy ctor)嗎? –
如果您定義了任何其他構造函數,而不是複製函數或賦值運算符,則會放棄編譯器生成的默認構造函數。 –