對於函式過載,函式模板和函式模板過載,c++需要乙個定義良好的策略,主要以以下步驟執行
第一步:建立候選函式列表。其中包含與被呼叫函式的名稱相同的函式和模板函式。
第二步:使用候選函式列表建立可行函式列表。這些都是引數數目正確的函式,為此有乙個臨時轉換序列,其中包括實參型別和相應的形參型別完全匹配的情況。
第三步:確定是否有最佳的可行函式,如果有則使用它,否則該函式呼叫出錯。
如下面呼叫:
void may(int); //#1float may(float,float=3); //
#2 void may(char); //
#3char* may(char *); //
#4char may(const
char &); //
#5templatevoid may(const t&); //
#6templatevoid may(t*); //
#7
may('b');
只考慮特徵標,不考慮返回型別,則#4和#7不可行。剩下5個可行的函式,從最佳到最差的順序如下所述。
1 完全匹配,但常規由於模板。
2 提公升轉換,(例如,int和shorts自動轉換為int,float自動轉換為double)。
3 標準轉換 (例如,int 轉換為char,long自動轉換為double)。
4.使用者自定義的轉換,如類宣告中定義的轉換。
其中#3,#5,#6都是完全匹配,但是#6為模板,故剩餘#3,#5進行選擇,這需要更深入的**。
完全匹配和最佳匹配
struct blot ;blot
int = ;
/*``````
*/recycle(ink);
void
recycle(blot);
void recycle(const
blot);
void recycle(blot&);
void recycle(const blot&);
上面原型都是完全匹配的,如果有多個匹配原型,則會生錯誤訊息,可能是二義性這樣的報錯。
然而,有的時候,即使兩個函式都是完全匹配,仍可完成過載解析。
指向非const的指標和引用優先於非const的指標和引用。
如果完全匹配的兩個函式都是模板函式,則較具具體的模板函式優先,即編譯器執行的轉換最少。
template void recycle (type t); //#1template void recycle (type *t); //
#2blot ink=;
recycle(&ink);
recycle(&ink)與#1模板匹配,type被解釋為blot*,與#2匹配被解釋為blot。
recycle(blot*)被認為是更具體的。因為在#2中,type已經被具體化為指標。
structdebts
;template
void showarray(t arr, int
n) cout
<}template
void showarray(t *arr, int
n) cout
<}int
main()
;
struct debts mr_e[3] =,,};
double* pd[3
];
for (int i = 0; i < 3; i++)
showarray(things, 6);
cout
<< "
mr_e's debts:
"
3);
}
結果:
template a:13 31 103 301 310 130
mr_e's debts:
template b:
2400 3889.2 231.3
jdk 編譯器版本比較
jdk 編譯器版本target 引數十六進製制 minor.major十進位制 minor.major jdk1.1.8 不能帶 target 引數 00 03 00 2d 45.3 jdk1.2.2 不帶 預設為 target 1.1 00 03 00 2d 45.3 jdk1.2.2 targe...
golang安裝 編譯器選擇
1安裝vscode golang 配置 go env w goproxy set environment variable allow bypassing the proxy for selected modules go env w goprivate corp.example.com go en...
C語言編譯器哪個好 6款好用的C語言編譯器推薦
其實win tc是款很不錯的軟體。去用一下你就知道了,因為我自學c時就是用的那個軟體,真的向你推薦它!推薦使用vc 6.0中文版,因為國家考試用的就是那個,當然了還有turbo c這個也是以前國家考試用的,但是這些版本很老了,而且沒有現在的方便,比如你遇到了問題想去諮詢下別人,老版本的尤其是比較經典...