“模板”学习笔记(3)-----为啥函数模板不能重载
=================箴言:函数模板是无法进行重载的====================
函数模板是无法进行重载的,这个原因比较无语。不是C++规定的,而是我们根本就无法这样做,因为如果这样做了,编译器根本就认不到~~下面我们就举一个例子来说所这个问题:
#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的年龄进行对调!下面我们就来看看这种程序:
#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行换成:
void Swap_1(people &a,people &b) { int temp;//用于存放年龄 temp=b.age; b.age=a.age; a.age=temp; }
这样的输出结果同上,囧!这样一来,模板真正没有什么存在的价值了!!!OK~~通过这两个程序的对比,我们就可以看出来函数模板是无法重载的。那么我们有没有什么其他的办法来解决这个问题的呢?如何才能让重载函数模板呢?
答案请见下次的笔记,^_^