「模板」學習筆記(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~~通過這兩個程序的對比,我們就可以看出來函數模板是無法重載的。那麼我們有沒有什麼其他的辦法來解決這個問題的呢?如何才能讓重載函數模板呢?
答案請見下次的筆記,^_^
推薦閱讀:
※學習公社
※凈空法師:孩子三歲前父母做出榜樣讓孩子學習,根才能扎穩
※如何教兒童學習英語
※在大學裡,你最好儘早習慣獨處
※民國將軍之鄉容縣學習之旅(一):黎村珊萃黃紹竑上將祖墳觀後筆記。|