2012-02-08 68 views
2

我試圖使用操作符重載%,因爲你不能在雙類型使用模量,重載operator%爲浮動類型

float a = 5.0; 
float b = 5.0; 
a = a % b; 
// not allowed 

我是想用這種功能重載操作符%:

template <> 
MyClass*    MyClass<float>::operator%(Myclass &other) 

對於其他操作不涉及浮動使用:

template <class T> 
MyClass*    MyClass<T>::operator%(MyClass &other) 

它從來沒有真正編譯我STU ck並且找不到一種方法來繞過這個問題,g ++仍然警告我,你不能在浮點模上執行模,用我的模板語法是錯誤的 或者它真的不可能。

+0

它爲什麼從不編譯? – Vyktor 2012-02-08 21:14:25

+2

在你可以使用的''中有'fmod()'函數。 – jrok 2012-02-08 21:18:21

+0

編譯時沒有運算符%重載分等工作得很好,但當我試圖在我的神話類中超載%時,g ++會發出警告。謝謝你的fmod()! – r3dalice 2012-02-08 21:27:02

回答

5

您不能按照您希望它運行的方式爲運算符重載運算符。

對於C++ 11 n3290草案,§13.5運算符重載,點6:

操作員功能須是非靜態成員函數或是非成員函數和具有在至少一個類型爲類的參數,對類的引用,枚舉或對枚舉的引用。 [...]

原始類型不是類(或枚舉),所以它們不能具有成員函數。而且您不能創建全局float operator%(float&,float&),因爲它不涉及參數列表中的類或枚舉。 (另請參閱C++FAQ 26.10 "Can I define an operator overload that works with built-in/intrinsic/primitive types?"。)
您至少需要將%表達式中的其中一個術語定義爲用戶定義的類型。

你可以創建一個類Float並定義要在其上的任何操作,但你不能得到a = a % b;使用你的函數,如果兩個abfloat秒。

或者你可以#include <cmath>並使用std::fmod

#include <iostream> 
#include <cmath> 

int main() 
{ 
    float a = 13.0f; 
    float b = 5.0f; 
    a = std::fmod(a, b); 
    std::cout << a << std::endl; 
    return 0; 
} 

與自定義「浮動包裝」簡單的例子(不完整的,可能不是很安全,因爲 - 是的,但可以讓你開始):

#include <iostream> 
#include <cmath> 

class Float { 
    private: 
        float val; 
    public: 
        Float(float f): val(f) {}; 

        Float operator%(Float const& other) const { 
            return std::fmod(val, other.val); 
        } 
        Float operator%(float const& other) const { 
            return std::fmod(val, other); 
        } 
        // conversion operator could be handy 
        operator float() { return val; } 
}; 

int main() 
{ 
    Float a = 13.0f; 
    Float b = 5.0f; 
    Float c  = a % b; 
    std::cout << c << std::endl; 
    // this also works 
    Float d = 13.0f; 
    float e = 5.0f; 
    float f  = d % e; 
    std::cout << f << std::endl; 
    return 0; 
} 
+0

答案+1也應該提及'fmod',並解釋_why_默認C++不會做浮點模。 – 2012-02-08 21:22:59

+0

我的例子是顯示什麼是不可能的,我在MyClass類上使用重載,這是模板到它裏面我有一個T _value變量。我很抱歉,如果你只是澄清的東西,它不明確我很抱歉謝謝你的幫助,我想我會使用fmod()。 – r3dalice 2012-02-08 21:25:56

+0

你也可以使用一種看起來更自然的不同語法:'float f =(Float)13%5;' – 2012-02-08 21:57:04