重载operator + C ++时出错

时间:2014-02-08 18:05:10

标签: c++ matrix multidimensional-array operator-overloading addition

我在尝试使用重载运算符+添加两个2D矩阵时遇到问题。我已成功将两个矩阵分配给两个不同的数组。

我的错误是:

  

在函数`mathadd :: matrices mathadd :: operator +(mathadd :: matrices&,mathadd :: matrices&)':

     

没有用于调用`mathadd :: matrices :: matrices(double&)'的匹配函数

     

候选人是:mathadd :: matrices :: matrices(const mathadd :: matrices&)

在我的int main(){}中,此错误的主要部分是:

matrices sample;
double array1[4][4], array2[4][4], add[4][4];
add[4][4] = array1[4][4] + array2[4][4];

重载的运算符定义是:

     matrices operator +(matrices& p1, matrices& p2)
      {
           double addition[4][4];
           for (int y = 0; y < 4; ++y )
           {
               for (int x = 0; x < 4; ++x )
               {
                    addition[4][4] = p1.get_array1() + p2.get_array2();
               }
            }
            matrices sum(addition[4][4]); // This is where the error is.
            return sum;
      }

我的班级看起来像这样

class matrices
  {
        public:
               matrices();
               void assignment(double one[4][4], double two[4][4]);
               double get_array1() const {return first_array[4][4];}
               double get_array2() const {return second_array[4][4];} 
               matrices operator +(matrices& p1, matrices& p2);
        private:
                double first_array[4][4], second_array[4][4];
                //Initialized to 0 in constructor.
  };

我不明白这个错误意味着什么,我将不胜感激任何帮助,了解它的意义以及如何解决它。

2 个答案:

答案 0 :(得分:3)

addition[4][4]是一个双重超出范围的数组访问权限,可以从double命名的第五个double[]中获取第五个addition。只需在addition中传递名称addition[4][4],而不是matrices sum(addition[4][4])

所以它应该是

matrices sum(addition);
return sum;

这只是编译器错误的来源。您的代码中也存在许多逻辑错误,例如我在前面提到的内部for循环中的越界数组访问。您将不得不修复这些或者获得未定义的行为。

答案 1 :(得分:1)

您收到错误的原因是您为operator +类型的对象定义了matrices,而不是double的2D数组。您需要在添加矩阵之前构造矩阵,如下所示:

首先,为matrices添加double[4][4]的构造函数。然后,将operator +的签名更改为static,并对其参数进行const引用:

static matrices operator +(const matrices& p1, const matrices& p2);

现在你可以这样写:

matrices add = matrices(array1) + matrices(array2);