为什么我不能将数组传递给函数模板?

Why I can't pass an array to function template?

我有这个 C++ 第五版的例子:

template <typename T> T fobj(T, T); // arguments are copied
template <typename T> T fref(const T&, const T&); // references
string s1("a value");
const string s2("another value");
fobj(s1, s2); // calls fobj(string, string); const is ignored
fref(s1, s2); // calls fref(const string&, const string&)
              // uses premissible conversion to const on s1
int a[10], b[42];
fobj(a, b); // calls f(int*, int*)
fref(a, b); // error: array types don't match

"在接下来的一对调用中,我们传递数组参数,其中数组大小不同,因此具有不同的类型。在对 fobj 的调用中,数组类型不同的事实并没有重要的。两个数组都转换为指针。fobj中的模板参数类型是int*。但是对fref的调用是非法的。当参数是引用时,数组是未转换为指针(§ 6.2.4,第 217 页)。ab 的类型不匹配,因此调用错误。"

如您所见,我已经制作了相同类型的 ab 但是它仍然无法编译,即使我传递了相同的数组 ab 两次 fref 它失败了。

那么为什么我仍然得到错误:array types don't match?谢谢。

对于此函数模板:

template <typename T> 
T fref(const T&, const T&); 

当您拨打电话时:

int a[42];
fref(a, a);

模板参数推导会将 T 推导为 int[42]。该调用无法编译,但是您问题中的原因 // error: array types don't match 不正确,因为数组类型确实匹配。

调用编译失败的原因是因为return类型也是T,你不能return数组类型,比如函数中的int[42] .

您可以通过任何方式解决此问题,使 fref 具有有效的 return 类型,例如你可以 return void:

template <typename T> void fref(const T&, const T&); 

如果您更改函数模板,您的数组大小相同的示例也可以工作

来自:

template <typename T> T fref(const T&, const T&); // references

至:

template <typename T> const T& fref(const T&, const T&); // references

这取决于您的意图 return。