2013-11-09 57 views
0

我读我的有关转换和模板类型参数的书,下面基本上是混淆了赫克了我(我写的,我引用的段落中我的问题):转换和模板类型参数

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

int a[10], b[42]; 
fobj(a,b); //calls f(int*, int*) 
fref(a,b); //error: array types don't match 

“在[这]对电话,我们通过在该阵列的大小不同,因此有不同类型[我的问题阵列参数:?因为被认为是不同类型不同大小的数组时,不能同时是的这些阵列类型“INT”阵列?这是什么意思呢?在调用fobj,事实上,数组类型不同也没关系。这两个数组转换为指针。该templat fobj中的e参数类型是int *。然而,对fref的呼叫是非法的。当参数是引用时,数组不会转换为指针。该类型的A和B不匹配,因此调用是错误的。 [问题2:再次,该怎么办类型a和b的不匹配,而究竟这是为什么调用非法?我不理解]“,因为是不同大小的数组时会考虑不同类型

回答

1

Q1

一直以来它的意思是,这两个数组有不同的类型:?

int a[10]; 
int b[42]; 

Q2怎么做的类型a和b不匹配,以及究竟这是为什么调用非法?我不理解

他们有不同类型,明确a有类型int[10]b有类型int[42]。当传递到期望int*功能类型可以衰减到在某些情况下,如int*。在引用的代码中的第一个函数模板中会发生这种情况。该模板被实例化成类似于

int* fobj(int*, int*); 

到目前为止很好。然而,通过参考以ab函数将需要的参数列表,诸如

int foo(int const (&array1)[10], int const (&array2)[42]); 

int const (&arr)[N]只供“const参照尺寸N阵列的int的”的语法。然后,可以接受两个数组与同一类型,但任意大小的元素的函数模板将

template <typename T, size_t N, size_t M> 
T fref(T const (&)[N], T const (&)[M]); 

当你实例与ab这个功能,你会得到一个功能像上面foo()