将数组作为实参传递
在C++中我们应该少用指针,多用引用,原因请大家自行搜索。在传递数组的时候我们需要格外注意,先让我们看一个简单的范例。
// PassArray.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; template <typename T> void Func1(T, T); template <typename T> void Func2(T&, T&); void Func3(int (&)[10], int (&)[12]); int _tmain(int argc, _TCHAR* argv[]) { int a[10], b[12]; Func1(a, b); Func2(a, b); Func3(a, b); return 0; } template <typename T> void Func1(T, T) { cout<<"Func1.invoked!"<<endl; } template <typename T> void Func2(T&, T&) { cout<<"Func2.invoked!"<<endl; } void Func3(int (&m)[10], int (&n)[12]) { cout<<"Func3.invoked!"<<endl; }
首先这个范例无法编译通过:
error C2782: 'void __cdecl Func2(T &,T &)' : template parameter 'T' is ambiguous
could be 'int [12]'
or 'int [10]'
原因就出在类型推断上。根据定义,Func2的类型必须是T&,也就是说传递实参的时候,两个形参必须是相同的,而这一点在模板编程中就会由编译器来负责推断。
Func1:
调用Func1(a, b)则推断的类型分别是Func1(int*, int*),调用函数将会自动将数组的首地址指针作为实参进行传递,因此类型推断两形参相同,编译通过!
Func2:
调用Func2(a, b)因为我们希望按引用的方式进行实参传递,因此需要遵循这样的规律:
(P208)如果形参是数组的引用,编译器将不会将数组实参转化为指针,而是传递数组引用的本身。在这种情况下,数组大小成为形参和实参类型的一部分。
所以推断类型分别是Func2(int (&)[10], int (&)[12]),因为int (&)[10] != int (&)[12],所以与T == T相悖!自然也就编译不过了!
Func3:
该函数是Func2的一个静态表示,通过上面的解释应该很容易理解这个代码了。
另:形参用字符指针,而实参是字符数组,这时候会发生什么?待解。
posted on 2009-11-16 09:24 Hibernate4 阅读(354) 评论(0) 编辑 收藏 举报