模板的一些高階主題

2021-08-26 07:34:13 字數 1870 閱讀 8026

一、模板與繼承

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...