Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组类型的模板参数推断_C++_Templates_Visual C++ - Fatal编程技术网

C++ 数组类型的模板参数推断

C++ 数组类型的模板参数推断,c++,templates,visual-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; } 模板 无效Foo(tx[D

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;
}
模板
无效Foo(tx[D]){
//遗漏细节
}
int main(){
浮动x[3];
Foo(x);//C2784:无法从“float[3]”推断“T[D]”的模板参数
返回0;
}
同样的代码通过了gcc和clang的测试

这是VC++2010的一个bug吗

如果是错误:

  • 有人知道它是否在更高版本的VC++中被修复了吗
  • 除了显式调用
    Foo
    ,还有其他解决方法吗
  • 如果不是bug:

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


    我已经将实际代码简化为这个小示例。我曾在其他编译器上试用过,但目前无法访问较新的Microsoft编译器。我在这方面也发现了类似的问题,但没有一个专门解决这个问题。

    类型为
    tx[D]
    的参数相当于
    tx[]
    aka
    tx
    <代码>D无法从中推断。使它<代码>无效FO(t(& x)[d])< /> >你这样传递一个数组的引用。

    用VisualStudio 2013和Visual C++编译器NOV 2013 CTP“我得到同样的错误。我不使用CLANG编译:”也没有GCC:啊,对不起GCC和Cang-Red鲱鱼。他们接受了一个更复杂的Foo版本,显然是因为他们能够从第二个参数推断出参数。但是微软VC++不接受更复杂的版本。因为复杂的版本太长,无法发布,所以我简化为这个版本,但实际上没有在gcc和clang上测试我的最后一次迭代。我不知道模板参数推导在这里是如何工作的,但是
    tx[]
    tx
    的类型不同。为什么它在gcc和clang中工作?@bolov:是的,在参数列表中是一样的(不能按值传递数组)。不,它在gcc和clang中不起作用,至少对我来说不起作用。@BenjaminLindley,我也不知道这里的模板推导,所以让我们先忘掉模板
    int x[]
    int*x
    的类型不同
    int*x
    是指针,而
    int x[]
    是数组类型的不完整类型。它们可以相互转换,但类型不同。我过去是错的,但我很确定我在这一点上是对的。你能解释一下为什么我错了吗?@bolov它们在函数声明中用于参数时是一样的。您甚至可以用一种方式声明函数,用另一种方式定义它:
    void f(int*x);void f(intx[]){…}
    谢谢C heritage。@bolov:在一个普通的声明中,你是对的,它们不一样。但是,作为函数参数,不能按值传递数组。因此,在我认为语言设计中的错误,C(和扩展名,C++),导致一个参数声明,看起来像一个数组,实际上是一个指针。因此,作为一个参数,
    int*x
    int x[]
    相同,与
    int x[100]
    相同,与
    int x[999999]
    相同。同样,这仅适用于参数。您正确地指出数组不是指针,请继续这样做。