C++ C++;XCode中的错误:在定义运算符*”时;没有可行的重载运算符*=";while*=已测试且功能正常

C++ C++;XCode中的错误:在定义运算符*”时;没有可行的重载运算符*=";while*=已测试且功能正常,c++,operator-overloading,C++,Operator Overloading,对于我的项目,我有一个将有理数表示为分数的结构: template <typename T=int> struct rat { T p; // Numerator T q; // Denominator rat(T x=0,T y=1): p(x), q(y){ normalize(); } 模板 结构大鼠 { tp;//分子 tq;//分母 大鼠(Tx=0,Ty=1):p(x),q(y){ 规范化(); } 运算符重载为(在结构中): rat和运算符*=(常

对于我的项目,我有一个将有理数表示为分数的结构:

template <typename T=int>
struct rat
{
  T p; // Numerator
  T q; // Denominator
  rat(T x=0,T y=1): p(x), q(y){

  normalize();

}
模板
结构大鼠
{
tp;//分子
tq;//分母
大鼠(Tx=0,Ty=1):p(x),q(y){
规范化();
}
运算符重载为(在结构中):

rat和运算符*=(常数rat和a)
{
本->p*=a.p;
这->q*=a.q;
规范化();
归还*这个;
}
我已经测试了这段代码,它是有效的

接下来,我想定义结构范围之外的操作:

template <typename T=int>
rat<T>& operator*(const rat<T>& a,const rat<T>& b)
    {
        return a*= b;
    }

template <typename T=int>
rat<T>& operator/(const rat<T>& a,const rat<T>& b)
    {
        return a/= b;
    }
模板
鼠和操作员*(常数鼠和a、常数鼠和b)
{
返回a*=b;
}
模板
鼠和操作员/(常数鼠和a、常数鼠和b)
{
返回a/=b;
}
但是,在xcode中构建“无可行的重载运算符”时,其中一些会出现错误。例如,/运算符可以工作,但*不能

<我是C++新手(我只做了一个星期的C++),我不知道为什么其中有些是好的,有些不是。它们都是一样的……/P> 如果需要更多的代码,我会提供它(但我尽量将混乱控制在最低限度)


提前感谢!

您的
运算符*
无法工作,因为它通过常量引用获取
a
,并应用对象上非常量的
运算符*=
。您必须通过值获取
a
,然后通过值返回它(否则将返回对局部变量的引用).

您的运算符
*=
是非
常量(因为它改变了状态),但是在自由函数中,您尝试调用
*=
上的
*=
常量和
,这就是无法找到重载的原因。您应该按值获取参数
a
,以便调用它的
*=
运算符

此外,您不应该从
操作符*
返回引用,您正在创建一个新对象,它既不是
a
也不是
b
。只需按如下值返回:

template <typename T=int>
rat<T> operator*(rat<T> a, const rat<T>& b)
{
    return a *= b;
}
模板
rat操作员*(rat a、const rat和b)
{
返回a*=b;
}

您的
运算符*
无法工作,因为它按常量引用获取
a
,并应用对象上的非常量
运算符*=
。您必须按值获取
a
,然后按值返回它(否则将返回对局部变量的引用)。将
a
复制到局部变量可能会更好,我不希望乘法运算符修改其参数。
rat运算符*(rata,const rat&b)确实修复了我的问题。谢谢,@瓦特米萨尔和@尼尔科克。如果我正确理解C++语言,通过<代码> RAT A/EXEC>在A.@ NeilKirk中复制一个值。
template <typename T=int>
rat<T> operator*(rat<T> a, const rat<T>& b)
{
    return a *= b;
}