c++ - 代码给出了“类型的引用......不能用值初始化......”但这个简单的修复解决了它。为什么?
问题描述
所以代码用于矩阵乘法
#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]”类型的值初始化
编辑:代码有点不同,但错误是一样的,现在错误出现在调用“乘法”的两个地方,当然在第二个参数上。
解决方案
不允许使用已知边界数组初始化对未知边界数组的引用。第二个参数
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
推荐阅读
- r - 有没有办法让 tidygeocode::geocode 重试错过的地址?
- reactjs - react 不将对象识别为参数
- postgresql - PostgreSQL generate_series 奇怪的行为
- python - 如何设置 url 的权限
- javascript - 如何使用 Javascript 在大循环中写入文件
- javascript - 如何让 Ajax 等待一个条件?
- javascript - webpack 如何在 node_modules 中选择相对路径?它完全引用 package.json 吗?
- random - 最适合 Metropolis–Hastings MCMC 的伪随机数生成器
- git - Git png 文件始终显示为“未暂存提交的更改”
- android - 我无法将挂起函数的值传递给 ViewModel