我正在学习c ++模板概念。我不明白以下几点。
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
T fun(T& x)
{
cout <<" X is "<<x;
cout <<"Type id is "<<typeid(x).name()<<endl;
}
int main ( int argc, char ** argv)
{
int a[100];
fun (a);
}
我在尝试什么?
1)T fun(T&amp; x)
这里x是一个引用,因此不会将'a'衰减为指针类型, 但在编译时,我收到以下错误。
error: no matching function for call to ‘fun(int [100])’
当我尝试非引用时,它工作正常。据我所知,数组被衰减为指针类型。
答案 0 :(得分:22)
C风格的数组是非常基本的结构,它们不像内置函数或用户定义的类型那样可赋值,可复制或可引用。要实现相当于通过引用传递数组,您需要以下语法:
// non-const version
template <typename T, size_t N>
void fun( T (&x)[N] ) { ... }
// const version
template <typename T, size_t N>
void fun( const T (&x)[N] ) { ... }
请注意,此处数组的大小也是一个模板参数,以允许函数使用所有数组大小,因为T[M]
和T[N]
不是M
的不同类型},N
。另请注意,该函数返回void。没有办法按值返回数组,因为数组不可复制,如前所述。
答案 1 :(得分:6)
问题在于返回类型:您无法返回数组,因为数组是不可复制的。顺便说一句,你什么都没有回来!
尝试改为:
template <typename T>
void fun(T& x) // <--- note the void
{
cout <<" X is "<<x;
cout <<"Type id is "<<typeid(x).name()<<endl;
}
它将按预期工作。
注意:原始的完整错误消息(使用gcc 4.8)实际上是:
test.cpp: In function ‘int main(int, char**)’:
test.cpp:17:10: error: no matching function for call to ‘fun(int [100])’
fun (a);
^
test.cpp:17:10: note: candidate is:
test.cpp:7:3: note: template<class T> T fun(T&)
T fun(T& x)
^
test.cpp:7:3: note: template argument deduction/substitution failed:
test.cpp: In substitution of ‘template<class T> T fun(T&) [with T = int [100]]’:
test.cpp:17:10: required from here
test.cpp:7:3: error: function returning an array
最相关的一行是最后一行。