typename的正確使用

2021-06-22 21:08:30 字數 1736 閱讀 7385

typename

的正確使用

一、在宣告模板引數時,

class

和typename

是可互換的。

以下完全等價:

templateclass widget;

templateclass widget;

二、通常情況下,必須用

typename

去標識巢狀依賴型別名,但在基類列表中或在乙個

建構函式的成員初始化列表中作為乙個基類識別符號時除外。

template

void print(const c& obj) }

帶::的預設不是型別名。所以,編譯器會把

c::const_iterator

* x理解為

c中乙個名為

const_iterator

的變數剩以x。

iter

的型別是

c::const_iterator

,乙個依賴於模板引數

c 的型別。乙個模板中的依賴於乙個模板引數的名字被稱為依賴名字。當乙個依賴名字巢狀在乙個

class

(類)的內部時,我稱它為巢狀依賴名字,即

::前是模板引數名或依賴於模板引數的型別名時。c::const_iterator

是乙個nested dependent name

(巢狀依賴名字)。實際上,它是乙個

nested dependent type name

(巢狀依賴型別名),也就是說,乙個涉及到乙個

type

(型別)的

nested dependent name

(巢狀依賴名字)。直到

c 成為已知之前,沒有任何辦法知道

c::const_iterator

到底是不是乙個

type

(型別),而當

template

(模板)

print

被解析的時候,

c 還不是已知的。

正確的做法:在巢狀依賴名字前用

typename

明確告訴編譯器

c::const_iterator

是乙個type

(型別):

template// this is valid c++

void print2nd(const c& container)}

該規則有

2個例外:

typename

不必前置於在乙個

list of baseclasses

(基類列表)中的或者在乙個

memberinitialization list

(成員初始化列表)中作為乙個

base classes identifier

(基類識別符號)的

nested dependenttype name

(巢狀依賴型別名)。例如:

template

class derived:

public base::nested

// as a base class identifier in a

... // mem. init. list: typename required};

的正確使用 眼霜正確的使用方法

眼睛周圍的肌膚是乙個人整張臉上最脆弱的部分,它嬌嫩柔弱,只要有稍稍的護理不慎,就會帶來不堪設想的後果,黑眼圈 眼袋之類的問題更是家常便飯了。我們可以使用日常眼霜保護眼周肌膚,緩解眼周肌膚的問題。然而,對於日常眼霜的使用,你知道多少,有一些你所不知道的錯誤用法,你是不是也中招了 日常眼霜的作用 日常眼...

typedef和typename的區別

typename指示乙個型別名,而非定義乙個型別,以下宣告了乙個seq iterator型別的變數itr,其中seq是乙個模板例項化時才知道的類 typename seq iterator itr 如果沒有typename指示,seq iterator會被認為是seq的靜態變數,而不是型別名。typ...

typename與class的區別

我們都知道,在stl中基本上都使用了模板類的宣告,即template。在模板類的宣告中,我們有兩種方式 template template 在這裡,class和typename是相同的。也就是說,在宣告乙個template type parameter 模板型別引數 的時候,class和typena...