Вы не можете перегружать операторов для примитивных типов так, как вы хотите, чтобы они работали.
Для 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;
}
Почему он никогда не компилируется? – Vyktor
Существует функция 'fmod()' в '', которую вы можете использовать. –
jrok
Он скомпилирован без оператора.% Div перегрузки и т. Д. Работает нормально, но g ++ предупреждает меня всякий раз, когда я пытался перегрузить% в моем классном классе. Спасибо вам за fmod()! – r3dalice