Вы не можете перегружать операторы для примитивных типов так, как вы хотите, чтобы они работали.
Для C ++ 11 черновик n3290, §13.5 Операторские перегрузки , точка 6:
Операторная функция должна быть нестатической функцией-членом или не-функцией-членом и иметь по крайней мере один параметр, тип которого является классом, ссылкой на класс, перечислением илиссылка на перечисление.[...]
Примитивные типы не являются классами (или перечислениями), поэтому они не могут иметь функции-члены.И вы не можете создать глобальный float operator%(float&,float&)
, поскольку он не включает класс или перечисление в списке параметров.(См. Также C ++ FAQ 26.10 «Можно ли определить перегрузку оператора, которая работает со встроенными / внутренними / примитивными типами?» .)
Вам нужен хотя бы один из терминов в %
выражение, чтобы быть пользовательским типом.
Вы можете создать класс Float
и определить любые операции, которые вы хотите над ним, но вы не можете заставить a = a % b;
использовать вашу функцию, если оба a
и b
- это float
с.
Или вы можете #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;
}