数值数组类:使用友元函数进行乘法

时间:2015-07-09 05:28:20

标签: c++ arrays generics overloading friend

我一直在努力解决这个问题。我创建了一个泛型数组类,我使用泛型继承来创建数值数组。一切都很完美;但是,我在数字数组的乘法/缩放方面遇到了麻烦。我按以下标准方式重载了运算符*:

  //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

再次感谢您的帮助:)

3 个答案:

答案 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. 您混淆了*=*的含义和实现。
  2. 错误涉及很多方面:模板实例化,const-correctness,重载解析......
  3. 所以,让我们看一下惯用的方法。

    第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)