2013-03-13 53 views
0

超載我似乎與我的運營商被調用我的C++程序的順序一個奇怪的問題,我已經創建了一些運營商根據自己的論點,即拋出異常類:發行與運營商在C++

class Variant 
{ 
public: 
..stuff.. 
Variant(int data) {..stuff..} 
operator int() throw(...) 
{ 
    if(type == 0) 
     return value; 
    else 
     throw 0; 
} 
Variant operator +(Variant &v) throw(...) 
{ 
    Variant res; 
    if(type == 2) { 
     res.value = v.value; 
     res.svalue = v.svalue; 
..stuff.. 
     else 
      throw 0; 
     res.type = type; 
    } 
    return res; 
} 
Variant operator *(Variant &v) throw(...) {..stuff..} 
} 
..stuff.. 
    int res1; 
    Variant res, res2; 
..stuff.. 
//   try { 
      if(res1 < 0) 

問題在於,在下一行Variant :: int()轉換操作符在變量res上被調用,並引發異常,即使所有操作數都是Variant,我們也不會調用Variant :: +操作符。可以看到)

   res = res + Variant(res1) * res2; 
      else 

鑑於在這下一行上正確的Vari螞蟻:: +運營商被調用,一切都很好

   res = res + res2; 
//   } catch (...) { 
//    error = "Invalid operator"; 
//    isok = false; 
// 

我只注意到乾脆把乘法在臨時Variant變量(如tempv =變(RES1)* RES2)分兩步工作做,但我不明白爲什麼。 } 任何人都可以建議什麼會導致編譯器嘗試並自動轉換爲int?我缺乏運營商或其他什麼?

+1

請粘貼顯示錯誤的最小**完整** C++程序。請參閱http://SSCCE.org瞭解更多信息。 – 2013-03-13 19:11:52

回答

3
Variant operator +(Variant &v) 

應該

Variant operator +(const Variant &v) 

的原因,你的operator+沒有被稱爲是因爲Variant(res1)創建不能綁定到非const參數Variant &v臨時。

+0

我相信他也需要至少一個'explicit'關鍵字,否則你的修復會導致編譯器錯誤。 – 2013-03-13 19:22:06

+0

你是對的,謝謝,它在將運算符參數更改爲const後工作。 – Cosmin 2013-03-13 19:25:00

0

「變種:: +運營商不會被調用」 - 因爲這是作爲例外工作,引發異常的嘗試所有的剩餘部分後的方式{}塊被跳過,控制前進到catch(。 ..){}塊