在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

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  maxweii  阅读(1216)  评论(0编辑  收藏  举报