为什么我不能将数组传递给函数模板?
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
和 b
但是它仍然无法编译,即使我传递了相同的数组 a
或 b
两次 fref
它失败了。
那么为什么我仍然得到错误:array types don't match
?谢谢。
- 我认为是书上的错误“
a
和b
的类型不匹配,所以调用错误”。还有一个问题,我做了同样类型的数组,还是不行。
对于此函数模板:
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。
我有这个 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
和 b
但是它仍然无法编译,即使我传递了相同的数组 a
或 b
两次 fref
它失败了。
那么为什么我仍然得到错误:array types don't match
?谢谢。
- 我认为是书上的错误“
a
和b
的类型不匹配,所以调用错误”。还有一个问题,我做了同样类型的数组,还是不行。
对于此函数模板:
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。