2013-02-06 186 views
3

在C++中,我試圖在條件運算符中使用隱式轉換。考慮下面這個例子:C++中的隱式轉換

class MyFloat 
{ 
    public:                  
     MyFloat(float val){m_val = val;} 
     operator float(){return m_val;} 
    protected: 
     float m_val; 
}; 

int main(int argc, char **argv) 
{ 
    MyFloat a = 0.5f; 
    MyFloat b = 1.0f;        
    float x = true ? a-0.5f : b; 
    return 0; 
} 

它會導致一個編譯器錯誤:

error: operands to ?: have different types ‘MyFloat’ and ‘float’ 

我希望有條件的經營者隱式轉換ba-0.5類型浮動。但是這並沒有發生。我如何實現這種隱式演員?

理想情況下,我想避免靜態轉換或像float MyFloat::getValue()這樣的存取方法。

+6

你從「隱式轉換」開始,然後用「隱式轉換」丟失了它。強制轉換是您在源代碼中編寫的內容,以告知編譯器進行轉換。沒有隱含演員這樣的事情。 –

+0

我只是試圖在MS Visual Studio 2012 Professional中編譯和運行你的代碼。 0錯誤,0警告,工作良好。 – LihO

+2

@LihO,它在GCC中失敗:http://ideone.com/9WPniF –

回答

8

問題是有兩個轉換。編譯器可以將a-0.5轉換爲MyFloat或者它可以將b轉換爲float。只要你有兩次轉換,但都沒有標記爲explicit,你就會一直得到這種模糊性。

+0

GCC驗證:http://ideone.com/885NAR –

+0

感謝您對鑄造vs轉換的回答和糾正。 – ethan

0

如果我沒有記錯,三元運算符不會進行任何隱式轉換。你要麼需要編寫

static_cast<MyFloat>(a-0.5) 

static_cast<float>(b). 

我會通過C++標準文檔挖掘,當我回家的更多細節。

+0

編譯器將這兩個參數轉換爲它們的公共類型。 –

+0

好吧,隨時忽略這個答案。我也在投票答案,因爲這可能是他的代碼無法編譯的原因。 – bstamour

1

只爲您完成一些轉換。從http://msdn.microsoft.com/en-us/library/e4213hs1(v=vs.71).aspx

第一個操作數必須是整數或指針類型。以下規則適用於第二個和第三個表達式:

  • 如果兩個表達式的類型相同,則結果爲該類型。
  • 如果兩個表達式都是算術或枚舉類型,則執行通常的算術轉換(包含在算術轉換中)以將它們轉換爲常用類型。
  • 如果兩個表達式都是指針類型,或者一個是指針類型,另一個是一個常量表達式,其值爲0,則執行指針轉換將它們轉換爲常用類型。
  • 如果這兩個表達式都是引用類型,則執行引用轉換將它們轉換爲通用類型。
  • 如果兩個表達式都是void類型,那麼通用類型是void類型。
  • 如果兩個表達式都是給定的類類型,那麼通用類型就是該類的類型。
+2

這就解釋了爲什麼@LihO使用Visual Studio編譯它。但是這些規則與語言定義不匹配。 –

+2

我也看到了,但它與另一個參考不一致:http://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator –