“如何超载”;操作员%”;在c++; 我想在C++中重载%操作符,以避免手工编辑一大块代码。我试过这个: static float operator %(const float& left, const float& right);

“如何超载”;操作员%”;在c++; 我想在C++中重载%操作符,以避免手工编辑一大块代码。我试过这个: static float operator %(const float& left, const float& right);,c++,operator-overloading,modulo,C++,Operator Overloading,Modulo,在我的头中,但它不起作用,因为“非成员运算符需要类或枚举类型的参数”。 我对C++是比较新的,我应该做什么?< /P> < P>操作符重载必须至少有一个参数作为用户定义类型。所以您不能这样做。这意味着,当所有操作数都是非类/枚举类型时,您不能重载运算符。i、 例如,当两侧都是浮点(或int,或任何其他基元类型)时,不能重写%的行为 在C++中,你不必声明操作符为静态,而不是C语言。参数可以是任何类型,返回值也可以是。第一种类型是类本身 例如: Test test; float x = test

在我的头中,但它不起作用,因为“非成员运算符需要类或枚举类型的参数”。
我对C++是比较新的,我应该做什么?< /P> < P>操作符重载必须至少有一个参数作为用户定义类型。所以您不能这样做。

这意味着,当所有操作数都是非类/枚举类型时,您不能重载运算符。i、 例如,当两侧都是
浮点
(或
int
,或任何其他基元类型)时,不能重写
%
的行为

<>在C++中,你不必声明操作符为静态,而不是C语言。参数可以是任何类型,返回值也可以是。第一种类型是类本身

例如:

Test test;
float x = test % 10.2f;

如前所述,不能为内部类型定义重载运算符

但是,如果您愿意利用隐式类型转换,您可以通过对实现重载%运算符的包装器类型上的一个浮点数进行一次转换来实现接近所需的效果

class FloatWrapper
{
private:
    float m_Float;

public:
    FloatWrapper(float Value):
      m_Float(Value)
    {
    }

    friend float operator%(const FloatWrapper& lhs, const FloatWrapper& rhs)
    {
        //your logic here...
        return (int)lhs.m_Float % (int)rhs.m_Float;
    }
};

int main()
{
float Value1 = 15.0f;
float Value2 = 4.0f;

float fMod1 = (FloatWrapper)Value1 % Value2;
float fMod2 = Value1 % (FloatWrapper)Value2;
return 0;
}

你不能重载基本类型的运算符。你能发布你将在该函数中执行的操作吗?我真的很想学习如何在浮点数上执行模运算@ArniBoy:我几乎只是想回答“因为C++不是Ruby”,但也许你没有得到那个引用。原因是阻止人们做你想做的事。想象一下,如果我在int上重载了
运算符+
,以执行乘法。任何人,包括我的头文件和它的定义,都将是一个疯狂的旅程。@ArniBoy:你知道在
中有
fmod
正是你想要的吗?这其实不是一回事。问题中有两个浮点数。哎呀!通过查看
static
和两个参数,我认为OP来自C#world!
class FloatWrapper
{
private:
    float m_Float;

public:
    FloatWrapper(float Value):
      m_Float(Value)
    {
    }

    friend float operator%(const FloatWrapper& lhs, const FloatWrapper& rhs)
    {
        //your logic here...
        return (int)lhs.m_Float % (int)rhs.m_Float;
    }
};

int main()
{
float Value1 = 15.0f;
float Value2 = 4.0f;

float fMod1 = (FloatWrapper)Value1 % Value2;
float fMod2 = Value1 % (FloatWrapper)Value2;
return 0;
}