2017-05-15 26 views
0

具有float的C++模數運算符。 我知道模%運算符只能在兩個操作數都是整數的情況下使用,如果一個人試圖使用浮點數,它會導致編譯錯誤。具有使用#define和自己的類型float的C++模數運算符

error C2296: '%' : illegal, left operand has type 'double' 

但是,我在某些情況下,我沒有控制和代碼做float float導致編譯問題。
因此,我試圖創建我自己的dbl極簡主義類來實現相同。

// testMod.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "math.h" 
class DBL{ 

public: 
    bool lastError; 
    float dbl; 
    DBL() 
    { 
     dbl = 0.0; 
    } 
    DBL(float b) 
    { 
     dbl = b; 
    } 
    /*float operator % (float t) 
    { 
     return fmod(dbl, t); 
    }*/ 
    operator float() 
    { 
     return dbl; 
    } 

    friend float operator % (DBL a, DBL b); 
}; 


float operator % (DBL a, DBL b) 
{ 
    return fmod(a.dbl, b.dbl); 
} 



#define float DBL 

int main(int argc, _TCHAR* argv[]) 
{ 
    float temp; 
    float a = 3.24; 
    float b = 4.32; 
    temp = a % b ; 
    temp = 0; 
    temp = a % b; 
    temp = 3.14 % 5.01; // compilation error here 
    return 0; 
} 

這不能編譯。我希望能夠使用隱式轉換,但似乎沒有這樣做。如果只處理%自己並取決於其他所有內容的默認轉換,那麼最小化轉換也是足夠的嗎?

+3

爲什麼不使用在標準頭文件''(或C頭文件'')中聲明的函數'fmod()'? – Peter

+3

你只需要*拿*控制。否則什麼都不會編譯。 – EJP

+5

您不能在內置類型之間重載運算符,也不能讓它們隱式轉換。沒有辦法解決這個事實,即除了重寫它之外,有人制作了不合格的代碼。 – nwp

回答

-1

我想你應該將值轉換爲整數,以便輸入將被支持。 (int)foo是最簡單的轉換,但它可能不足以滿足您的需求。如果它不能滿足您的需求,那麼您將需要編寫自己的自定義轉換。如果這種方法無法解決您的問題,那麼您將需要修改庫的源代碼(如果合法且必要的話,通過逆向工程),或者如果這不是一個選項,請讓作者在庫中使用fmod 。你的想法很聰明,但不幸的是這不是事情的方式。

相關問題