2015-01-10 144 views
-1

我用我自己的Bignum標題運算符重載,並且有一些運算符優先級問題。運營商超載的運營商優先級?

編譯器說,當我做bignum + int時有一些錯誤。 (我Bignum的類名是 'BIGNUM' 不要介意。)

這裏是我的類定義:

operator long long(void) const { 
    return atoll(num.c_str()); 
} 
operator +(bignum b) { 
    //c=this+b 
    return c; 
} 

這裏是錯誤發生的情況:

bignum a(1); 
int b=1; 
bignum c = a+b; //this is the case 

錯誤

第7行:智能感知:「+」不止一個操作員是 與操作數一致。
內置運算符「算術+ 算術」
函數「minary :: bignum :: operator +(minary :: bignum b)」
操作數格式爲minary :: bignum + int。 c:\ Users \ Secret \ Documents \ Visual Studio 2013 \ Projects \ Calculator \ Calculator \ Source.cpp 11 3計算器

在此先感謝。

+0

你的問題是,編譯器可以看到兩種方法來添加一個bignum和一個int。第一種方法是將這個長方形變成一個很長的長度,然後加上int。第二種方法(大概是,你不顯示bignum構造函數)是將int轉換成一個bignum並調用你的超載。 – Neil

+0

@minary是啊,現在好多了。 – doc

回答

1

最簡單的方法是將轉換爲整數explicit:無論如何,許多隱式轉換都會導致問題。有時隱式轉換是有用的,但如果你想對付混合型算術他們往往是更多的問題不是幫助:

class bignum { 
    // ... 
    explicit operator long long() const { ... } 
    // ... 
}; 

使得轉換操作符explicit是一個C++ 11功能。你的類似乎也有一個從整數類型到bignum的隱式轉換,即相應的構造函數。在C++ 11之前,你只能製造這些構造函數explicit。這可能是處理含糊不清的另一個選項,但它會影響轉換爲long long和使用內置整數加法。我的猜測是,你想要一個bignum作爲一個結果,要求沒有合適的轉換爲整型。

請注意,該問題有沒有任何與操作優先級有關:對於任何給定的表達式,編譯器確定哪些重載最適合(粗略地說:需要最少量的隱式轉換)。如果它找到多個同樣優秀的候選人,它會認爲該計劃模糊不清,並要求解決歧義問題。

+0

謝謝!我認爲這是因爲運營商的優先考慮......無論如何,非常感謝! – minary