C 中typename關鍵字的使用方法和注意事項

2021-05-22 09:29:46 字數 1627 閱讀 2478

1, 什麼地方使用?用在模板定義裡,標明其後的模板引數是型別引數。

例如template

t foo(const t& t, const y& y);

templace

class ctest

其實,這裡最常用的是使用關鍵字class,而且二者功能完全相同,這裡的class和定義類時的class完全是兩回事,c++當時就是為了減少關鍵字,才使用了class.但最終卻不得不引入了typename,究竟是

什麼原因呢?請看第二條,也就是typename的第二個用法。

2, 模板中標明「內嵌依賴型別名」

這裡有三個詞,內嵌、依賴、型別名。那麼什麼是「內嵌依賴型別名(nested dependent type name)」?

請看sgi stl裡的乙個例子, 只是stl中count范型演算法的實現:

template

typename iterator_traits<_inputiter>::difference_type

count(_inputiter __first, _inputiter __last, const _tp& __value)

這裡有三個地方用到了typename:返回值、引數、變數定義。分別是:

typename iterator_traits<_inputiter>::difference_type

typename iterator_traits<_inputiter>::value_type

typename iterator_traits<_inputiter>::difference_type __n = 0;

difference_type, value_type就是依賴於_inputiter(模板型別引數)的型別名。原始碼如下:

template

struct iterator_traits ;

內嵌是指定義在類名的定義中的。以上difference_type和value_type都是定義在iterator_traits中的。

依賴是指依賴於乙個模板引數。typename iterator_traits<_inputiter>::difference_type中difference_type依賴於模板引數_inputiter.

型別名是指這裡最終要指出的是個型別名,而不是變數。例如iterator_traits<_inputiter>::difference_type完全有可能是類iterator_traits<_inputiter>類裡的乙個static對

象。而且當我們這樣寫的時候,c++預設就是解釋為乙個變數的。所以,為了和變數區分,必須使用typename告訴編譯器。

那麼是不是所有的t::type_or_variable, 或者tmpl:type_or_variable都需要使用typename呢?不是,有以下兩個例外。

3 例外

(1)類模板定義中的基類列表。

例如template

class derived: public base::***

(2)類模板定義中的初始化列表。

derived(int x) : base::***(x)

為什麼這裡不需要呢?因為編譯器知道這裡需要的是型別還是變數,

(1)基類列表裡肯定是型別名,(2)初始化列表裡肯定是成員變數名。

typedef和typename關鍵字

1 型別說明typedef 型別說明的格式為 typedef 型別 定義名 型別說明只定義了乙個資料型別的新名字而不是定義一種新的資料型別。定義名表示這個型別的新名字。只是個別名而已。例如 用下面語句定義整型數的新名字 1 typedef int type int 使用說明後,type int就成為...

詳解C 的模板中typename關鍵字的用法

typename的使用場合 用處1,用在模板定義裡,標明其後的模板引數是型別引數。例如template t foo const t t,const y y templace class ctest 其實,這裡最常用的是使用關鍵字class,而且二者功能完全相同,這裡的class和定義類時的class...

java中關鍵字final static使用總結

一.final final類不能被繼承,沒有子類,final類中的方法預設是final的。final方法不能被子類的方法覆蓋,但可以被繼承。final成員變數表示常量,只能被賦值一次,賦值後值不再改變。final不能用於修飾構造方法。父類的private成員方法是不能被子類方法覆蓋的,因此priva...