分享

“模板”学习笔记(3)

 My镜像站 2011-12-26

=================箴言:函数模板是无法进行重载的====================

      函数模板是无法进行重载的,这个原因比较无语。不是C++规定的,而是我们根本就无法这样做,因为如果这样做了,编译器根本就认不到~~下面我们就举一个例子来说所这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
struct people
{
    char name[10];
    int age;
};
template<class ElementType>
void Swap(ElementType &a,ElementType &b)
{
    ElementType temp;
    temp=b;
    b=a;
    a=temp;
}
int main()
{
    int x=1,y=2;
    cout<<"交换之前,x="<<x<<"\ty="<<y<<endl;
    Swap(x,y);
    cout<<"交换之后,x="<<x<<"\ty="<<y<<endl;
    people person_1={"unqiue",22};
    people person_2={"jack",30};
    cout<<"交换之前,第一个人的名字叫:"<<person_1.name<<"\t年龄为:"<<person_1.age<<endl;
    cout<<"交换之前,第二个人的名字叫:"<<person_2.name<<"\t年龄为:"<<person_2.age<<endl;
    Swap(person_1,person_2);
    cout<<"调用Swap()函数的结果:"<<endl;
    cout<<"交换之后,第一个人的名字叫:"<<person_1.name<<"\t年龄为:"<<person_1.age<<endl;
    cout<<"交换之后,第二个人的名字叫:"<<person_2.name<<"\t年龄为:"<<person_2.age<<endl;
    return 0;
}

  首先在这个程序的第3行我们定义了一个结构体变量people,它含有两个参数,名字(name)和年龄(age)。然后我们在程序的第9行到15行写了一个模板函数Swap(),它的作用就是交换a和b中的值。在主程序中,我们首先在20行调用Swap()函数来交换整型变量x和y的值;之后我们在程序的第22和23行分别用结构体people定义了两个人person_1和person_2的名字和年龄,然后我们想在程序的第26行交换他们。输出如下:

      可以看到,在输出中我们调用Swap()函数之后,第一个人和第二个人其实只是对换了一下位置。即person_1里面存储的就是jack和30,而 person_2里面存储的就是unique和22。反正我觉着这种程序在实际生活中没有任何意思,因为不就是调换一下位置么。真正有难度的是如何让 jack的年龄和unqiue的年龄进行对调!下面我们就来看看这种程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
struct people
{
    char name[10];
    int age;
};
template<class ElementType>
void Swap(ElementType &a,ElementType &b)
{
    ElementType temp;
    temp=b;
    b=a;
    a=temp;
}
 
template<class ElementType>
void Swap_1(ElementType &a,ElementType &b)
{
    int temp;//用于存放年龄
    temp=b.age;
    b.age=a.age;
    a.age=temp;
}
int main()
{
    int x=1,y=2;
    cout<<"交换之前,x="<<x<<"\ty="<<y<<endl;
    Swap(x,y);
    cout<<"交换之后,x="<<x<<"\ty="<<y<<endl;
    people person_1={"unqiue",22};
    people person_2={"jack",30};
    cout<<"交换之前,第一个人的名字叫:"<<person_1.name<<"\t年龄为:"<<person_1.age<<endl;
    cout<<"交换之前,第二个人的名字叫:"<<person_2.name<<"\t年龄为:"<<person_2.age<<endl;
    Swap(person_1,person_2);
    cout<<"调用Swap()函数的结果:"<<endl;
    cout<<"交换之后,第一个人的名字叫:"<<person_1.name<<"\t年龄为:"<<person_1.age<<endl;
    cout<<"交换之后,第二个人的名字叫:"<<person_2.name<<"\t年龄为:"<<person_2.age<<endl;
    Swap_1(person_1,person_2);
    cout<<"调用Swap_1()函数的结果:"<<endl;
    cout<<"交换之后,第一个人的名字叫:"<<person_1.name<<"\t年龄为:"<<person_1.age<<endl;
    cout<<"交换之后,第二个人的名字叫:"<<person_2.name<<"\t年龄为:"<<person_2.age<<endl;
    return 0;
}

  在这个程序中,我们只想交换 jack和unique的年龄,但是这是不可能通过重载Swap()函数实现。因为这里的Swap()函数并不涉及的到功能的升级啊之类的。所以它的返回 值和参数的类型和在第9行定义的Swap()函数是一模一样的,这样一来,编译器就不能分辨出到底哪个Swap()函数才是我们想要的。所以在程序的第 18行,我们只能用另外一个函数Swap_1()来代替原先那个Swap()函数,虽然它们的功能基本上相同~~

      程序的输出结果如下:

      上面这种解决办法我想是一件极其郁闷的事情!如果我们都像程序的第18行到24行这样来运用模板,那模板的作用就根本没有发挥出来嘛。我们还不如把程序的17行到24行换成:

1
2
3
4
5
6
7
void Swap_1(people &a,people &b)
{
    int temp;//用于存放年龄
    temp=b.age;
    b.age=a.age;
    a.age=temp;
}

  这样的输出结果同上,囧!这样一来,模板真正没有什么存在的价值了!!!OK~~通过这两个程序的对比,我们就可以看出来函数模板是无法重载的。那么我们有没有什么其他的办法来解决这个问题的呢?如何才能让重载函数模板呢?

      答案请见下次的笔记,^_^

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多