C++ 当普通函数不使用时,为什么模板函数接收带有1D引用的2D数组';T void fun(char&a)[2])//1D引用 {} 模板 void funT(T&a)[大小]//1D引用 {} int main() { 字符c[2][2];//二维数组 fun(c);//错误 funT(c);//好的!!!?? }
我可以预料C++ 当普通函数不使用时,为什么模板函数接收带有1D引用的2D数组';T void fun(char&a)[2])//1D引用 {} 模板 void funT(T&a)[大小]//1D引用 {} int main() { 字符c[2][2];//二维数组 fun(c);//错误 funT(c);//好的!!!?? },c++,arrays,templates,pass-by-reference,C++,Arrays,Templates,Pass By Reference,我可以预料fun()会出现错误,但是funT()怎么会正常工作呢! 在这种行为中是否有任何引用,或是“强>是在C++语言中的错误< /强>? t>代码>将解析为 char *代码> char(2)< /Cord>,因此,模板功能不应该有任何问题。 编辑:感谢詹姆斯指出这一点。因为c的类型不是char[2],它与第一个不匹配 功能。在模板的情况下,T解析为char[2],这意味着 最后一个参数类型是char(&a)[2][2]。(你可以想出来 随着T成为typedef到char[2]的等价物,以
fun()
会出现错误,但是funT()
怎么会正常工作呢!
在这种行为中是否有任何引用,或是“强>是在C++语言中的错误< /强>?
<代码> t>代码>将解析为<代码> char *<代码>代码> char(2)< /Cord>,因此,模板功能不应该有任何问题。
编辑:感谢詹姆斯指出这一点。因为
c
的类型不是char[2]
,它与第一个不匹配
功能。在模板的情况下,T
解析为char[2]
,这意味着
最后一个参数类型是char(&a)[2][2]
。(你可以想出来
随着T
成为typedef
到char[2]
的等价物,以及
在此基础上展开参数类型。)-1,因为答案不正确。他的代码中没有涉及任何
char*
。在函数模板中,请尝试打印cout。需要注意的是char c[2][2]
不是二维数组,而是一维数组的一维数组。这条推理路线使理解问题变得简单c
是一个1D数组,只是不是我第一次猜测的char
。我甚至对@RedX给出的与指针相关的答案感到惊讶。
void fun (char (&a)[2]) // 1D reference
{}
template<typename T, int SIZE>
void funT (T (&a)[SIZE]) // 1D reference
{}
int main ()
{
char c[2][2]; // 2D array
fun(c); // error
funT(c); // ok !!!??
}