[英]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页),该类型的a
和b
不匹配,所以调用出错。”
我对最后一次调用fref(a, b)
只有一个困惑:为什么它是非法的?
我认为因为数组的大小是其类型的一部分所以直到这里a
的类型为int[10]
而b
的类型为int[42]
但问题在于我试图使大小相同它无法编译:
int a[10], b[10]; fref(a, b); // error: array types don't match int a[10], b[42]; fref(a, a); // error: array types don't match
正如你所看到的,我已经创建a
相同类型的a
和b
但是它仍然无法编译,即使我将相同的数组a
或b
传递给fref
两次,它也会失败。
那么为什么我仍然收到错误: array types don't match
? 谢谢你。
a
和b
的类型不匹配,因此调用出错” a
书中的错误。 还有另一个问题,因为我已经制作了相同类型的数组,但仍然无法正常工作。对于此功能模板:
template <typename T>
T fref(const T&, const T&);
当您拨打电话时:
int a[42];
fref(a, a);
模板参数推导将推导出T
为int[42]
。 调用无法编译,但您问题中的原因,即// error: array types don't match
是不正确的,因为数组类型确实匹配。
调用无法编译的原因是因为返回类型也是T
,并且您不能从函数返回数组类型,例如int[42]
。
您可以通过任何方式解决此问题,以便fref
具有有效的返回类型,例如您可以返回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
这取决于您打算返回的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.