Почему я не могу вернуть первый элемент массива в шаблон?
Рассмотрим:
#include <iostream>
template <typename T> T getArray( T &arr ) {
return *arr;
}
int main() {
int a[] = {5, 3, 6};
std::cout << getArray(a);
}
Предположим, что он напечатал первый элемент в массиве, но он не работает. Почему это?
Это дает мне ошибку:
error: no matching function for call to 'getArray(int [3])'
Ответы
Ответ 1
Тип a
равен int[3]
, поэтому тип T
равен int[3]
. Массивы не могут быть возвращены из функций.
В С++ 11 вы можете сделать это:
template <typename T>
auto getArray(T &arr) -> decltype(*arr)
{
return *arr;
}
Или это:
// requires <type_traits>
template <typename T>
typename std::remove_extent<T>::type& getArray(T &arr)
{
return *arr;
}
В С++ 03 вы можете сделать это, но это не совсем то же самое:
template <typename T>
T getArray(T* arr /* not really an array */)
{
return *arr;
}
Или:
template <typename T, std::size_t N>
T getArray(T (&arr)[N])
{
return *arr;
}
Ответ 2
Try
template <typename T, size_t N>
T getArray( T (&arr)[N] ) {
return *arr;
}
так что T
- это тип элемента, а не массив.
Ответ 3
Он даже не компилируется на MSVС++ 2010 Express. Как я и ожидал, это связано с тем, что вы используете ссылку как параметр, скаляр как возвращаемое значение и указатель передается на вызов функции. Я не знаю точных правил относительно шаблонов (например, как точно определяется тип), но этот код должен путать ад с компилятором. Следующий код возвращает то, что вы ожидали от него.
#include <iostream>
template <typename T> T getArray( T* arr ) {
return *arr;
}
int main() {
int a[] = {5, 3, 6};
std::cout << getArray(a);
}
Ответ 4
Не могли бы вы попробовать:
#include <iostream>
template <typename T> T getArray( T arr[] ) {
return *arr;
}
int main() {
int a[] = {5, 3, 6};
std::cout << getArray(a);
}