对于我的项目,我有一个结构,表示一个有理数作为分数:
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 ++)而且我不知道为什么其中一些是好的而另一些则不行。他们都定义了相同的......
如果需要更多代码,我会提供它(但我试图将混乱降到最低)。
提前致谢!
答案 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;
}