XCode中的C ++错误:在定义operator *“没有可行的重载运算符* =”而* =已经过测试且功能正常

时间:2015-03-29 12:56:01

标签: 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();

}

操作符被重载为(在struct中):

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构建时会出错:#34;没有可行的重载运算符&#34;。例如,/运算符工作。但*没有。

我是C ++的新手(我现在只做了一个星期的C ++)而且我不知道为什么其中一些是好的而另一些则不行。他们都定义了相同的......

如果需要更多代码,我会提供它(但我试图将混乱降到最低)。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您的operator *无法正常工作,因为它通过const引用需要a并在对象上应用非{const} operator *=。您必须按值a,并按值返回(否则将返回对局部变量的引用)。

答案 1 :(得分:0)

您的运营商*=不是const(因为它会更改其状态)但是在您的免费功能中,您尝试在*=上调用const&这就是过载的原因无法找到。您应该按值获取参数a,以便它可以调用*=运算符。

此外,您不应该从operator*返回引用,而是创建一个不是a也不是b的新对象。只需按价值返回:

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