「模板」學習筆記(3)

=================箴言:函數模板是無法進行重載的====================

函數模板是無法進行重載的,這個原因比較無語。不是C++規定的,而是我們根本就無法這樣做,因為如果這樣做了,編譯器根本就認不到~~下面我們就舉一個例子來說所這個問題:

12345678910111213141516171819202122232425262728293031 #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<<" y="<<y<<endl;Swap(x,y);cout<<"交換之後,x="<<x<<" y="<<y<<endl;people person_1={"unqiue",22};people person_2={"jack",30};cout<<"交換之前,第一個人的名字叫:"<<person_1.name<<" 年齡為:"<<person_1.age<<endl;cout<<"交換之前,第二個人的名字叫:"<<person_2.name<<" 年齡為:"<<person_2.age<<endl;Swap(person_1,person_2);cout<<"調用Swap()函數的結果:"<<endl;cout<<"交換之後,第一個人的名字叫:"<<person_1.name<<" 年齡為:"<<person_1.age<<endl;cout<<"交換之後,第二個人的名字叫:"<<person_2.name<<" 年齡為:"<<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的年齡進行對調!下面我們就來看看這種程序:

1234567891011121314151617181920212223242526272829303132333435363738394041424344 #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<<" y="<<y<<endl;Swap(x,y);cout<<"交換之後,x="<<x<<" y="<<y<<endl;people person_1={"unqiue",22};people person_2={"jack",30};cout<<"交換之前,第一個人的名字叫:"<<person_1.name<<" 年齡為:"<<person_1.age<<endl;cout<<"交換之前,第二個人的名字叫:"<<person_2.name<<" 年齡為:"<<person_2.age<<endl;Swap(person_1,person_2);cout<<"調用Swap()函數的結果:"<<endl;cout<<"交換之後,第一個人的名字叫:"<<person_1.name<<" 年齡為:"<<person_1.age<<endl;cout<<"交換之後,第二個人的名字叫:"<<person_2.name<<" 年齡為:"<<person_2.age<<endl;Swap_1(person_1,person_2);cout<<"調用Swap_1()函數的結果:"<<endl;cout<<"交換之後,第一個人的名字叫:"<<person_1.name<<" 年齡為:"<<person_1.age<<endl;cout<<"交換之後,第二個人的名字叫:"<<person_2.name<<" 年齡為:"<<person_2.age<<endl;return 0;}

  在這個程序中,我們只想交換jack和unique的年齡,但是這是不可能通過重載Swap()函數實現。因為這裡的Swap()函數並不涉及的到功能的升級啊之類的。所以它的返回值和參數的類型和在第9行定義的Swap()函數是一模一樣的,這樣一來,編譯器就不能分辨出到底哪個Swap()函數才是我們想要的。所以在程序的第18行,我們只能用另外一個函數Swap_1()來代替原先那個Swap()函數,雖然它們的功能基本上相同~~

程序的輸出結果如下:

上面這種解決辦法我想是一件極其鬱悶的事情!如果我們都像程序的第18行到24行這樣來運用模板,那模板的作用就根本沒有發揮出來嘛。我們還不如把程序的17行到24行換成:

1234567 void Swap_1(people &a,people &b){int temp;//用於存放年齡temp=b.age;b.age=a.age;a.age=temp;}

  這樣的輸出結果同上,囧!這樣一來,模板真正沒有什麼存在的價值了!!!OK~~通過這兩個程序的對比,我們就可以看出來函數模板是無法重載的。那麼我們有沒有什麼其他的辦法來解決這個問題的呢?如何才能讓重載函數模板呢?

答案請見下次的筆記,^_^


推薦閱讀:

學習公社
凈空法師:孩子三歲前父母做出榜樣讓孩子學習,根才能扎穩
如何教兒童學習英語
在大學裡,你最好儘早習慣獨處
民國將軍之鄉容縣學習之旅(一):黎村珊萃黃紹竑上將祖墳觀後筆記。|

TAG:學習 | 筆記 | 模板 |