数组类型的模板参数推导

Adr*_*thy 4 c++ templates visual-c++

Microsoft VC++ 2010在此代码中出错:

template <int D, typename T>
void Foo(T x[D]) {
  // details omitted
}

int main() {
  float x[3];
  Foo(x);  // C2784: could not deduce template argument for 'T [D]' from 'float [3]'
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

相同的代码通过gcc和clang进行集合.

这是VC++ 2010的错误吗?

如果是一个bug:

  1. 有谁知道它是否已在更高版本的VC++中修复?
  2. 除明确调用之外还有解决方法Foo<3, float>吗?

如果它不是一个bug:

是否有gcc和clang的扩展,允许他们解析模板参数?

我已经将实际代码大大简化为这个小例子.我已经在其他编译器上尝试过,但我目前无法访问更新的Microsoft编译器.我在SO上发现了类似的问题,但没有一个专门针对这种情况.

Igo*_*nik 6

类型的参数T x[D]等同于T x[]aka T* x.D无法从中推断出来.制作它void Foo(T (&x)[D])- 你以这种方式传递对数组的引用.

  • @bolov:是的,它在参数列表中是相同的(你不能按值传递数组).不,它不适用于gcc和clang,至少不适合我. (2认同)