为什么我能';是否将数组传递给函数模板? 我有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

为什么我能';是否将数组传递给函数模板? 我有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,c++,arrays,pointers,template-argument-deduction,C++,Arrays,Pointers,Template Argument Deduction,正如您所看到的,我已经制作了相同类型的a和b,但是它仍然无法编译,即使我将相同的数组a或b两次传递给fref,它也会失败 那么为什么我仍然得到错误:数组类型不匹配?多谢各位 我认为这是书中的错误,“a和b的类型不匹配,因此调用是错误的”。还有一个问题,因为我制作了相同类型的数组,但仍然不能工作 对于此功能模板: template <typename T> T fref(const T&, const T&); 模板参数推断将T推断为int[42]。调用无法编译

正如您所看到的,我已经制作了相同类型的
a
b
,但是它仍然无法编译,即使我将相同的数组
a
b
两次传递给
fref
,它也会失败

那么为什么我仍然得到错误:
数组类型不匹配
?多谢各位

  • 我认为这是书中的错误,“a和b的类型不匹配,因此调用是错误的”。还有一个问题,因为我制作了相同类型的数组,但仍然不能工作

对于此功能模板:

template <typename T> 
T fref(const T&, const T&); 
模板参数推断将
T
推断为
int[42]
。调用无法编译,但问题中的原因,即
//错误:数组类型不匹配
,是不正确的,因为数组类型确实匹配

调用无法编译的原因是返回类型也是
T
,并且不能从函数返回数组类型,例如
int[42]

您可以通过任何方式修复此问题,使
fref
具有有效的返回类型,例如,您可以返回
void

template <typename T> void fref(const T&, const T&); 
模板无效fref(常数T&,常数T&);

如果您更改函数模板,那么使用相同数组大小的示例将起作用

发件人:

模板T fref(常数T&,常数T&);//参考资料
致:

模板常数T&fref(常数T&,常数T&);//参考资料

这取决于您想要返回的内容。

首先请注意,它们可能会衰减为指针。这就是
fobj
调用中发生的情况。但是在
fref
调用中,它们不会衰减为指针,而且由于数组大小是类型的一部分,因此您有不同的类型,因此会出现编译器错误。@darcamo:但我不这么认为。因为我已经做了相同类型的第二个例子
a
b
10
整数的数组。请重读一遍。感谢you@darcamo这也是我的第一个想法,但如果你检查问题的结尾,他们会试图绕过这个问题,但没有成功。我编辑了这个主题,因为我已经复制了错误的段落。数组的类型(或对数组的引用)取决于它所具有的元素数。因此,包含10个元素的数组与包含42个元素的数组在类型上有所不同。当传递的两个数组大小相同时,问题是无法按值返回数组-要解决此问题,请将返回类型更改为引用(这意味着返回的内容必须在函数返回和其他约束之后存在——如果返回一个参数,则返回的引用也必须是
const
)或者返回其他东西。太棒了,太棒了!非常感谢。我从来没有想过。是的,我们肯定不能返回数组。我真的很感激。我已经纠正了另一种方法:让
fref
返回指向
T
的引用或指针也起作用:
模板T&fref(…)
。在您发布答案之前,我将返回类型更改为void,并得出了相同的原因。我甚至会在编译器中将其称为“bug”,因为类型匹配,编译器告诉我们错误的信息。@Maestro没问题:)是的,我不确定您实际上想要返回什么,因为这个问题似乎是理论性的
T&
是合理的,但是像往常一样,要小心悬挂引用。@Maestro我以前没有读过这篇文章:p但是是的,那条注释
//错误:数组类型不匹配
是错误的。我的回答有点晚了。
int a[42];
fref(a, a);
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