首页 > 解决方案 > 代码给出了“类型的引用......不能用值初始化......”但这个简单的修复解决了它。为什么?

问题描述

所以代码用于矩阵乘法

#include <iostream>

int FibbonaciOperator[2][2] = {
    1, 0,
    0, 1};

int FibbonaciStarter[2] = {
    0, 1};

void multiply(int (&Matrix)[2][2], int (&Matrix2)[][2]) // int(&Matrix2)[2][2]
{

   int MatrixRez[2][2] = {
       0, 0, 0, 0};

   for (int i = 0; i < 2; i++)
      for (int j = 0; j < 2; j++)
         for (int k = 0; k < 2; k++)
            MatrixRez[i][j] += Matrix[i][k] * Matrix2[k][j];

   Matrix[0][0] = MatrixRez[0][0];
   Matrix[0][1] = MatrixRez[0][1];
   Matrix[1][0] = MatrixRez[1][0];
   Matrix[1][1] = MatrixRez[1][1];
}

void FastExponentiation(int (&Matrix)[2][2], int exponent)
{
   int temp[2][2] = {
       0, 1,
       1, 1};
   for (int i = 30; i >= 0; i--)
   {
      multiply(Matrix, Matrix);
      if (exponent & (1 << i))
         multiply(Matrix, temp);
   }
}

int main()
{

   FastExponentiation(FibbonaciOperator, 5);

   std::cout << FibbonaciOperator[1][0];

   fflush(stdin);
   std::cin.get();
   return 0;
}

调用函数“multiply”时出现“temp”错误。

但是,当您用注释部分替换函数中的第二个参数时,或者准确地说是添加二维数组的完整维度,错误就会消失。

我的问题是为什么?

整个错误信息:

“int (&)[][2]”类型的引用(非 const 限定)不能用“int [2][2]”类型的值初始化

编辑:代码有点不同,但错误是一样的,现在错误出现在调用“乘法”的两个地方,当然在第二个参数上。

标签: c++arraysmatrix

解决方案


不允许使用已知边界数组初始化对未知边界数组的引用。第二个参数

void multiply(int (&Matrix)[2][2], int (&Matrix2)[][2])

是对未知边界数组的引用,并且

int temp[2][2]

是一个已知界限的数组。这个电话

multiply(Matrix, temp);

不被允许。

“可以形成对未知边界数组的引用和指针,但不能从数组和指向已知边界数组的指针中初始化或分配。”

https://en.cppreference.com/w/cpp/language/array#Arrays_of_unknown_bound


推荐阅读