XCode 中的 C++ 错误:在定义运算符 * "no viable overloaded operator *=" 时 *= 已经过测试并且可以正常工作

C++ Error in XCode: in defining operator* "no viable overloaded operator *=" while *= has been tested and is functional

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

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

  normalize();

}

运算符重载为(在结构内):

rat<T>& operator*=(const rat<T>& a)
{
    this->p *= a.p;
    this->q *= a.q;
    normalize();
    return *this;
}

我已经测试了这段代码并且它有效。

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

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;
    }

但是,其中一些在 xcode "no viable overloaded operator" 中构建时会出错。例如,/ 运算符有效。但是 * 没有。

我是 C++ 的新手(我现在只学了一个星期的 C++),我不知道为什么有些可以,有些不行。它们的定义都是一样的...

如果需要更多代码,我会提供(但我尽量减少混乱)。

提前致谢!

您的 operator * 无法工作,因为它通过 const 引用获取 a 并应用对象上非常量的 operator *=。您必须按值获取 a,并按值获取 return(否则您会 return 对局部变量的引用)。

您的运算符 *= 不是 const(因为它改变了状态)但是在您的自由函数中您尝试在 const& 上调用 *= 这就是为什么找不到过载。您应该按值获取参数 a,以便它可以调用其 *= 运算符。

此外,您不应该 return 从 operator* 引用,您正在创建一个既不是 a 也不是 b 的新对象。像这样 return 按值计算:

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