考虑:
#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])'
的类型 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;
}
尝试
template <typename T, size_t N>
T getArray( T (&arr)[N] ) {
return *arr;
}
以便 T
是元素的类型,而不是数组。
它甚至不能在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);
}
你能尝试一下:
#include <iostream>
template <typename T> T getArray( T arr[] ) {
return *arr;
}
int main() {
int a[] = {5, 3, 6};
std::cout << getArray(a);
}