練習16.32
在模板實參推斷過程中發生了什麼?
解答:【引用】在模板實參推斷過程中改變一起使用函式呼叫中的實參型別來尋找模板實參,用這些模板實參生成的函式版本與給定的函式呼叫最為匹配。
練習16.33
指出在模板實參推斷過程中允許對函式實參進行的兩種型別轉換。
解答:1. const轉換,可以將乙個非const物件的引用(或指標)傳遞給乙個const的引用(或指標)形參。
2. 陣列或函式指標轉換:如果函式形參不是引用型別,則可以對陣列或函式型別的實參應用正常的指標轉換。乙個陣列實參可以轉換為乙個指向其首元素的指標。類似的,乙個函式實參可以轉換為乙個該函式型別的指標。
練習16.34
對下面的**解釋每個呼叫是否合法。如果合法,t的型別是什麼?如果不合法,為什麼?
templateint compare(const t&, const t&);
(a) compare("hi", "world");
(b) compare("bye", "dad");
解答:(a)不合法,兩個實參的型別不一致,error: no matching function for call to 『compare(const char [3], const char [6])』
(b)合法,compare(const char [4], const char [4]) (感謝asjdhs同學的提醒)
練習16.35
下面呼叫中哪些是錯誤的(如果有的話)?如果呼叫合法,t的型別是什麼?如果呼叫不合法,問題何在?
template t calc(t, int);
template t fcn(t, t);
double d; float f; char c;
(a) calc(c, 'c');
(b) calc(d, f);
(c) fcn(c, 'c');
(d) fcn(d, f);
解答:(a) 合法,型別為char
(b) 合法,型別為double
(c) 合法,型別為char
(d) 不合法,這裡無法確定t的型別是float還是double
練習16.36
進行下面的呼叫會發生什麼:
template void f1(t, t);
template void f2(t1, t2); //書中函式定義沒有返回值,在c++不允許這樣宣告函式。
int i = 0, j = 42, *p1 = &i, *p2 = &j;
const int *cp1 = &i, *cp2 = &j;
(a) f1(p1, p2);
(b) f2(p1, p2);
(c) f1(cp1, cp2);
(d) f2(cp1, cp2);
(e) f1(p1, cp1);
(f) f2(p1, cp1);
解答:(a) f1(int*, int*);
(b) f2(int*, int*);
(c) f1(const int*, const int*);
(d) f2(const int*, const int*);
(e) f1(int*, const int*); 這個使用就不合法
(f) f2(int*, const int*);
第十六章 16 1 1節練習
練習16.1 給出例項化的定義。解答 例項化,就是編譯器將乙個函式模板中的型別用乙個具體型別替換的過程。練習16.2 編寫並測試你自己版本的compare函式。解答 這個函式模板的實現,可以參考書中的實現。不過這裡要注意的是,當你的實現中涉及到比較運算子的時候,需要確定你使用的型別支援比較運算子。練...
第十六章 16 4 3節練習
練習16.58 為你的strvec類及你為16.1.2節 第591頁 練習中編寫的vec類新增emplace back函式。解答 這個參考623頁的strvec中的emplace back實現即可。練習16.59 假定s是乙個string,解釋呼叫svec.emplace back s 會發生什麼。...
第十六章 16 5節練習
練習16.62 定義你自己版本的hash,並定義乙個sales data物件的unordered multiset。將多條交易記錄儲存到容器中,並列印其內容。解答 這個參考書中的實現吧。練習16.63 定義乙個函式模板,統計乙個給定值在乙個vector中出現的次數。測試你的函式,分別傳遞給它乙個do...