数值数组类:使用友元函数进行乘法运算
Numeric Array Class: Multiplication using friend functions
我已经尝试解决这个bug好几天了。我制作了一个泛型数组类,从中我使用泛型继承创建了一个数字数组。一切都很完美;但是,我在数字数组的乘法/缩放方面遇到了问题。我以以下标准方式超载操作员*:
//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((甚至没有识别出friend函数的存在。我以前使用过几次friend函数,但我对模板还很陌生。有人告诉我,模板和通用编程通常有一些奇怪而古怪的必需品,这可能会导致不可预见的情况。
对于任何想要查看完整程序的人,请参阅下拉框链接:https://www.dropbox.com/sh/86c5o702vkjyrwx/AAB-Pnpl_jPR_GT4qiPYb8LTa?dl=0
再次感谢您的帮助:(
友元函数中的NumericArray<Type>
是const,它不能调用非const函数---NumericArray<Type>& NumericArray<Type> :: operator * (const double factor)
NumericArray<Type>& operator * (const double factor)
这是一个非常数成员函数。这意味着它可能会改变它调用的对象
免费运营商函数中的参数(如果调用上面的公共运营商,则不需要是朋友(是
const NumericArray<Type>&
因此CCD_ 3合格。
为了解决这个问题,您需要将成员函数更改为可在const限定的实例上调用(假设它确实不会改变它的实例,而这不应该((*(:
NumericArray<Type>& operator * (const double factor) const
(*(你的正在改变它的实例,这与直觉相反:
c = a * b;
一般来说,您不希望a
在那之后发生更改。
正如Nicky C在他的回答中所建议的那样,这里最好的方法可能是将operator*=
作为(非常量,公共(成员函数,它正在做你的operator*
目前似乎正在做的事情。
然后添加两个免费的operator*
函数,它们使用operator*=
来实现它们的行为。
所以在这种情况下不需要friend
。
我不确定是否要解释所有内容,因为如果深入研究,可能会很复杂。但简而言之:
- 您混淆了
*=
和*
的含义和实现 - 这些错误涉及很多方面:模板实例化、常量正确性、过载解决
所以,让我们看看惯用的方法。
步骤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
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- C++中一个函数对数组进行搅乱和平方运算的问题
- 转换具有不同参数类型的二进制运算函数
- 实现数学函数C++的乘法运算
- 试图理解传递给函数的参数的求值(如果涉及一些算术运算)
- SSE内部函数导致正常浮点运算返回-1.#INV
- 数值数组类:使用友元函数进行乘法运算
- 使用 CIN 函数在 C++ 中输入数学运算
- 矩阵运算,构造函数问题