当普通函数没有时,为什么模板函数接收带有1D引用的2D数组

时间:2011-05-25 11:41:57

标签: c++ arrays templates pass-by-reference

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 !!!??
}

我可以预期fun()会出错,但funT()怎么办呢? 标准中是否有任何关于此类行为的引用或C ++语言中的是一个错误吗?

2 个答案:

答案 0 :(得分:11)

因为c的类型不是char [2],所以它与第一个不匹配 功能。在模板案例中,T解析为char [2],这意味着 最终的参数类型是char (&a)[2][2]。 (你可以想到它 因为T等同于typedefchar[2],并且 根据它扩展参数类型。)

答案 1 :(得分:1)

T将解析为 char* char[2],因此您的模板化功能不会出现任何问题。

编辑:感谢詹姆斯指出这一点。