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;
}
相同的代码通过了 gcc 和 clang 的审核。
这是 VC++ 2010 的错误吗?
如果是bug:
- 有谁知道它是否已在更高版本的 VC++ 中得到修复?
- 除了显式调用
Foo<3, float>
之外是否有解决方法? ?
如果不是bug:
是否有 gcc 和 clang 的扩展允许它们解析模板参数?
我已将实际代码大大简化为这个小示例。我已经在其他编译器上试过了,但我目前无法访问更新的 Microsoft 编译器。我在 SO 上发现了类似的问题,但没有一个专门针对这种情况。
最佳答案
T x[D]
类型的参数等同于 T x[]
又名 T* x
。 D
不能从中推导出来。使其成为 void Foo(T (&x)[D])
- 您正在以这种方式传递对数组的引用。
关于c++ - 数组类型的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21686207/