为什么我不能在模板中返回数组的第一个元素?

时间:2012-08-13 22:03:20

标签: c++ arrays templates

考虑:

#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])'

4 个答案:

答案 0 :(得分:12)

a的类型为int[3],因此T的类型为int[3]无法从函数返回数组。

在C ++ 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; 
} 

在C ++ 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; 
} 

答案 1 :(得分:2)

尝试

template <typename T, size_t N>
T getArray( T (&arr)[N] ) {
    return *arr;
}

因此T是元素的类型,而不是数组。

答案 2 :(得分:1)

它甚至无法在MSVC ++ 2010 Express上编译。正如我所料,这是因为您使用引用作为参数,标量作为返回值并且指针被传递给函数调用。我不知道有关模板的确切规则(即确定类型的确切方式),但该代码必须混淆编译器的地狱。以下代码返回您希望返回的内容。

#include <iostream>

template <typename T> T getArray( T* arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}

答案 3 :(得分:1)

你可以尝试一下:

#include <iostream>

template <typename T> T getArray( T arr[] ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}