Почему я не могу вернуть первый элемент массива в шаблон?

Рассмотрим:

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

}