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

Mae*_*tro 2 c++ arrays pointers template-argument-deduction

我有这个来自 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
Run Code Online (Sandbox Code Playgroud)

“在接下来的一对调用中,我们传递数组参数,其中数组的大小不同,因此具有不同的类型。在调用中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
    
    Run Code Online (Sandbox Code Playgroud)

正如你可以看到我做了ab同类型的但它仍然无法编译,即使我通过相同的阵列ab两次fref失败。

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

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

cig*_*ien 6

对于此功能模板:

template <typename T> 
T fref(const T&, const T&); 
Run Code Online (Sandbox Code Playgroud)

当您拨打电话时:

int a[42];
fref(a, a);
Run Code Online (Sandbox Code Playgroud)

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

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

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

template <typename T> void fref(const T&, const T&); 
Run Code Online (Sandbox Code Playgroud)