C++ 数组类型的模板参数推断
Microsoft VC++2010在此代码中提供了一个错误: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
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吗
如果是错误:
Foo
,还有其他解决方法吗我已经将实际代码简化为这个小示例。我曾在其他编译器上试用过,但目前无法访问较新的Microsoft编译器。我在这方面也发现了类似的问题,但没有一个专门解决这个问题。类型为
tx[D]
的参数相当于tx[]
akatx
<代码>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]
相同。同样,这仅适用于参数。您正确地指出数组不是指针,请继续这样做。