【发布时间】:2014-02-10 19:31:02
【问题描述】:
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 的错误吗?
如果是错误:
- 有谁知道它是否已在更高版本的 VC++ 中得到修复?
- 除了显式调用
Foo<3, float>之外,还有其他解决方法吗?
如果不是bug:
是否有 gcc 和 clang 的扩展允许它们解析模板参数?
我已将实际代码大大简化为这个小示例。我已经在其他编译器上尝试过,但我目前无法访问更新的 Microsoft 编译器。我在 SO 上发现了类似的问题,但没有一个专门针对这种情况。
【问题讨论】:
-
使用 'Visual Studio 2013' 和 'Visual C++ Compiler Nov 2013 CTP' 我得到同样的错误。
-
我无法使用 clang 编译:coliru.stacked-crooked.com/a/918ee9e151031a46 -- 也不是 gcc:coliru.stacked-crooked.com/a/0399a5aff6ce0f83
-
啊,对不起 gcc 和铿锵红鲱鱼。他们接受了更复杂的 Foo 版本,显然是因为他们能够从第二个参数中推断出参数。但是 MS VC++ 不接受更复杂的版本。由于复杂的版本太长无法发布,我简化为这个,但实际上并没有在 gcc 和 clang 上测试我的最后一次迭代。
标签: c++ templates visual-c++