c++ - 数组类型的模板参数推导

标签 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;
}

相同的代码通过了 gcc 和 clang 的审核。

这是 VC++ 2010 的错误吗?

如果是bug:

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

如果不是bug:

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

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

最佳答案

T x[D] 类型的参数等同于 T x[] 又名 T* xD 不能从中推导出来。使其成为 void Foo(T (&x)[D]) - 您正在以这种方式传递对数组的引用。

关于c++ - 数组类型的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21686207/

相关文章:

c++ - Cocos2dx - C++ 如何将 child 添加到 Sprite 而无需将它们堆叠在一起

c++ - 如何通过静态结构数组专门化模板函数

php - 使用 Smarty 评论/跳过标记

C++ 是否可以定义从 pair<int, int> 到 pair<float,float> 的隐式转换?

c++ - Malloc 和 new 运算符分配内存有什么区别?

c++ - CToolTipCtrl 未显示

c++ - 如何在c中使用IWbemContext的 "__ProviderArchitecture"标志?

c++ - 将类对象作为参数传递给 boost::thread

c++17 如何编写 is_pointer_pointer 泛型 lambda?

c++ - CRTP 编译检测与模板组合