“模板”学习笔记(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~~通过这两个程序的对比,我们就可以看出来函数模板是无法重载的。那么我们有没有什么其他的办法来解决这个问题的呢?如何才能让重载函数模板呢?

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

posted @ 2011-08-10 17:48  uniqueliu  阅读(2409)  评论(1编辑  收藏  举报