繁体   English   中英

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

[英]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的调用中,数组类型不同的事实并不重要。两个数组都被转换为指针。模板参数类型在fobjint* 。所述的呼叫fref ,但是,是非法的。当参数是一个参考,阵列不被转换为指针(§6.2.4,第217页),该类型的ab不匹配,所以调用出错。”

  • 我对最后一次调用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相同类型的ab但是它仍然无法编译,即使我将相同的数组ab传递给fref两次,它也会失败。

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

  • 我认为这是“ ab的类型不匹配,因此调用出错” a书中的错误。 还有另一个问题,因为我已经制作了相同类型的数组,但仍然无法正常工作。

对于此功能模板:

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

当您拨打电话时:

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

模板参数推导将推导出Tint[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM