2012-02-08 3 views
2

Я пытаюсь перегрузить оператор%, потому что вы не можете использовать модуль на двойных типах,Перегрузка оператор% для плавающих типов

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) 

Он никогда не компилируется на самом деле я сту ck и не может найти способ обойти эту проблему, g ++ все еще предупреждает меня, что вы не можете выполнять modulo на поплавках, что-то не так с моим синтаксисом шаблона, или это действительно невозможно.

+0

Почему он никогда не компилируется? – Vyktor

+2

Существует функция 'fmod()' в '', которую вы можете использовать. – jrok

+0

Он скомпилирован без оператора.% Div перегрузки и т. Д. Работает нормально, но g ++ предупреждает меня всякий раз, когда я пытался перегрузить% в моем классном классе. Спасибо вам за fmod()! – r3dalice

ответ

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; использовать функцию, если оба a и b являются float s.

Или вы могли бы #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++ не выполняет по модулю с плавающей запятой. –

+0

Мой пример должен был показать, что невозможно, я использую перегрузку в классе MyClass, который замаскирован внутри него. У меня есть переменные T_value. Извините, если у вас получилось просто уточнить, что это было непонятно. Я думаю, извините, спасибо за помощь. Думаю, я буду использовать fmod(). – r3dalice

+0

Вы также можете использовать другой синтаксис, который может выглядеть более естественным: 'float f = (Float) 13% 5;' –

Смежные вопросы