我一直在努力解决这个问题。我创建了一个泛型数组类,我使用泛型继承来创建数值数组。一切都很完美;但是,我在数字数组的乘法/缩放方面遇到了麻烦。我按以下标准方式重载了运算符*:
//Scaling operator
template <typename Type>
NumericArray<Type>& NumericArray<Type> :: operator * (const double factor) // scaling the elements
{
for (int i = 0; i < (*this).size(); i++)
{
(*this)[i] *= factor;
}
return *this;
}
当然,由于此实现所要求的固有顺序,我只能以数组* 2的方式进行乘法运算。但我也希望能够编写2 *数组。所以我决定实现一个友元函数如下:
template <typename Type>
NumericArray<Type> operator* (Type factor, const NumericArray<Type>& num_array)
{
return(num_array * factor);
}
这个朋友功能的声明如下:
template <typename Type> friend NumericArray<Type> operator * (double factor, const NumericArray<Type>& num_array);
但是当我尝试在main()中编写2 *数组时,我收到错误消息:
严重级代码说明项目文件行 错误C2678二进制'*':找不到带有'const NumericArray'类型左手操作数的运算符(或者没有可接受的转换)
错误让我觉得main()甚至不会识别友元函数存在。我以前曾经使用过几次朋友函数,但我对模板很新。我被告知模板和通用编程通常有一些奇怪的古怪必需品,这可能会导致不可预见的情况。
对于想要查看完整程序的任何人,请参阅dropbox链接: https://www.dropbox.com/sh/86c5o702vkjyrwx/AAB-Pnpl_jPR_GT4qiPYb8LTa?dl=0
再次感谢您的帮助:)
答案 0 :(得分:1)
NumericArray<Type>& operator * (const double factor)
这是一个非const成员函数。这意味着它可能会改变它所调用的对象。
自由运算符函数中的参数(如果上面调用公共运算符则不需要是朋友)
const NumericArray<Type>&
因此const
合格。
要解决它,你需要将成员函数更改为在const限定实例上可调用(假设它实际上不会改变它的实例,它不应该这样)(*):
NumericArray<Type>& operator * (const double factor) const
(*)你们正在改变它的实例,这是违反直觉的:
c = a * b;
通常,您不希望在此之后更改a
。
正如Nicky C在他的回答中所建议的那样,这里最好的方法可能就是拥有一个operator*=
as(非const,public)成员函数,它正在执行你operator*
目前正在做的事情
然后添加两个免费operator*
函数,这些函数使用operator*=
来实现其行为。
因此在这种情况下不需要friend
。
答案 1 :(得分:1)
我不确定是否要解释所有内容,因为如果我们深入了解它会很复杂。但简而言之:
*=
和*
的含义和实现。所以,让我们看一下惯用的方法。
第1步:写一个成员operator *=
。
template <typename Type>
class NumericArray
{
//...
NumericArray& operator *= (const Type factor)
{
[[ Code that scales up every element, i.e. your for-loop ]]
return *this;
}
//...
}
第2步:写一对非会员非朋友operator *
template <typename Type>
NumericArray<Type> operator * (const NumericArray<Type>& num_array, const Type factor)
{
NumericArray<Type> new_num_array = num_array; // Copy construct
new_num_array *= factor; // Scale up
return new_num_array;
}
// And similarly for factor*num_array
答案 2 :(得分:1)
NumericArray<Type>
是const,它不能调用非const函数--- NumericArray<Type>& NumericArray<Type> :: operator * (const double factor)