我尝试使用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
都可以工作。
如果要强制执行X
和Y
,请尝试通过引用传递数组:
void f(int (&a)[X][Y])
或者使用CCD_ 9。