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;
}
对于我的项目,我有一个将有理数表示为分数的结构:
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;
}