模板用作数组维度时如何工作



我尝试使用tempaltes作为数组维度值。当我试图指定错误的维度作为临时参数时,我感到困惑。例如代码:

#include <iostream>
using namespace std;
template <int X, int Y>
void f(int a[X][Y]) {
for (int i = 0; i < X; ++i) {
for (int j = 0; j < Y; ++j) {
cout << a[i][j] << " ";
}
cout << 'n';
}
}
int main() {
int a[2][2] = {{1, 2}, {3, 4}};
f<2, 2>(a); // compilation succeeded
f<10, 2>(a); // compilation succeeded
f<2, 10>(a); // compilation FAILED
}

为什么在最后一种情况下编译失败,但在<10、2>不是吗?

error: no matching function for call to 'f'
note: candidate function template not viable: no known conversion from 'int [2][2]' to 'int (*)[10]' for 1st argument

您得到这个结果是因为f(int a[X][Y])谎言

数组在C++中不是一流的公民。不能按值将数组作为函数参数传递。因此,当您编写这样的参数时,它会被静默地调整为指针(仅限于第一级(。因此CCD_ 2的类型实际上是CCD_。

由于在a的类型中没有X,所以绝对任何X都可以工作。

如果要强制执行XY,请尝试通过引用传递数组

void f(int (&a)[X][Y])

或者使用CCD_ 9。

相关内容

  • 没有找到相关文章

最新更新