十
一、模板與繼承
1、當從模板類派生出子類時必須注意的是:子類並不會從通用的模板基類繼承而來,只能從基類的某一例項繼承而來。
這樣的話就有以下幾種繼承方式:
a、基類是模板類的乙個特定例項版本,比如templateclass b : public a{};
b、基類是乙個和子類相關的乙個例項,比如templateclass b : public a{};
這時當例項化乙個子類b的時候,基類就相應的被例項化為乙個和子類相同的例項版本,比如bm;模板類b被例項化為int 版本,這時基
類a也相應的被例項化為int版本。
c、templateclass b : public t 這種用法最普遍,也最難,atl中廣泛使用此法.屬於基於模板的復用,和基於繼承的復用不同.它非常巧妙的用了模板的特性模擬了c++的多型,而不是採用虛函式.
d、如果基類是乙個特定的例項的版本,這時子類可以不是乙個模板,比如class b : public a{}。
//模板與繼承的示例
#include
#include
using std::string;
using std::cout;
using std::endl;
template
class a
}; //以下是幾種繼承方式
templateclass b : public a
//錯誤,模板形參t在這裡是不可見的說明符。錯誤原因在於,繼承並不會從通用的基類中繼承而來,只能是從某一特定的基類中繼承而來。
class e: public a{}; //從特定例項繼承時子類可以是一般的類
void main()
十二、模板中的關鍵字typename和class的區別
1、首先typename是乙個較新的關鍵字,而class是比較老的關鍵字,
在類模板的宣告中使用哪個都是一樣的。
2、必須使用typename關鍵字的情況:當有乙個模板,且模板的型別形參和某乙個類名同名,而且這個同名的類中又有
乙個巢狀類的時候就要使用關鍵字typename了,比如有類class t;}; 則templateclass b;這時的語句就會出錯,因為模板類b 無法區別出t::a 表示的是乙個型別還是乙個資料成員,在c++裡面預設情
況下是乙個資料成員,在這裡的語句t::a m就會出錯,會出現m前缺少型別說明符的錯誤。要使該式正確就必須在
t::a前加上typename關鍵字以說明t::a表示的是乙個型別。即templateclass b這樣就正
確地宣告了乙個類t 的巢狀類a 的物件m。當然如果模板的型別形參和那個類名不同名時不會出現這種錯誤,比如
把巢狀類b的外圍類的類名改為d,則在模板類b中的語句d::b m;將是正確的語句。
#include "iostream"
using namespace std;
//關鍵字typename 和class 的區別的示例
class t
}; }; //定義乙個帶有巢狀的類t。
int t::e = 3;
templateclass a
; //模板形參與帶有巢狀的類t不同名,所以這裡的語句t::b a是正確的。當然在前面加上
//typename關鍵字也不會出錯。
template
class d
; //模板形參與帶有巢狀類的類名同名,在語句t::b b;前必須加上typename以指
//定這裡的巢狀類b是乙個型別而不是乙個表示式。
template
class f
};//這個範例可以看出如果不在t::e前加typename則系統
// 預設表示的是e是乙個資料成員,而不是乙個型別。
int main()
關於Noise and Error主題的一些小知識
此筆記源於台灣大學林軒田老師 機器學習基石 機器學習技法 答案是不會。當訊號中加入了noise,其實對我們之前學過的內容不產生任何本質上的影響。現在noise對資料產生了什麼影響?之前,f x 是確定的。現在f x 不確定了。因為noise的存在會影響f x 的值。此時y更像是服從某一概率分布。但是...
git的一些高階
git clone git git.test.git git branch a 列出有幾個branch,其中一般mask是星號的,當前的。git checkout b myomap4 origin omap4 dev 新checkout 乙個分支 origin omap4 dev 並命名為myoma...
c 模板的一些
stl中大量的運用了模板 今天就拿stl 的容器和一些相關的操作來說明下 std set 新增自定義比較操作 templatestruct lesscmp std set ms 2 迴圈遍歷,這個肯定木有難度了 template void myprint const t lhs for each m...