2013-11-09 2 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 тот факт, что типы массивов отличаются, не имеет значения. Оба массива преобразуются в указатели. e тип параметра в fobj - int *. Однако вызов fref является незаконным. Когда параметр является ссылкой, массивы не преобразуются в указатели. Типы a и b не совпадают, поэтому вызов ошибочен. [Вопрос 2: снова, как типы a и b не совпадают, и почему именно этот вызов является незаконным? Я не понимая] "

ответ

1

Q1, так как, когда массивы разных размеров Рассматривались различные типы

Поскольку всегда Что это означает, что эти два массива имеют разный тип:?.

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

Q2 как типы а и б не совпадают, и почему именно этот вызов незаконным? Я не понимая

У них есть другой тип, явно a имеет тип int[10] и b имеет тип int[42]. Тип может распадаться до int* в определенных контекстах, например, когда они передаются в функции, ожидающие int*. Это то, что происходит в первом шаблоне функции кода, который вы цитировали. Шаблон получает экземпляр в нечто вроде

int* fobj(int*, int*); 

Пока все хорошо. Тем не менее, функция, принимающая a и b по ссылке потребуется список параметров, таких как

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]); 

При создании экземпляра этой функции с a и b, вы получите функцию, как foo() выше.

Смежные вопросы