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
(模板)
被解析的時候,
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...