條款42 了解typename的雙重含義

2022-01-22 06:20:47 字數 1096 閱讀 9039

typename在很多種情況下與class是完全相同的,例如下面的使用:

1 templame2

......

3 template

4 ......

條款42:了解typename的雙重含義

1 template2

void print2nd(const

c containter)

310 }

上面這個式子是無法通過編譯的:這裡的const_iterator實際上是個巢狀從屬名稱,編譯器實際上並不知道這是個型別名稱的。所以除非我們主動的告訴編譯器這是個型別名,否則其就會報錯:

1 typename c::const_iterator iter(container.begin());

那麼也就是說:任何時候想要在template中指涉乙個巢狀從屬型別名稱的話,那麼就需要在起前面放上typename關鍵字。當然他typename僅僅可以用在這個方面,其他的非巢狀從屬型別名稱上用typename實際上是不允許的:

1 template2

void f(const c & container, //

注意,這裡的c前面即不允許加上typename

3 typename c::iterator iter);

還有兩種其他的不允許使用typename的特殊情況是:typename不可以出現在base class list內的巢狀從屬型別名稱之前,也不能在成員初始化列表中修飾base class

stl中經常也會用到了typename:

1 template2

void

workwithiterator(iter iter)

3

這裡用iterator_traits機制將iterator的value_type強制的萃取出來了,中間很長的變數宣告實際上可以作為乙個typedef:

1 typedef typename std::iterrator_traits::value_type value_type;

之後就可以肆無忌憚的使用value_type了,避免過長的宣告式。

條款42 了解typename的雙重意義

條款42 了解typename的雙重意義 includeusing namespace std templatevoid print2nd const c container templatevoid f const c container,不允許使用typename c並不是巢狀 從屬型別名稱,解...

了解C 中typename的雙重意義

typename的最多用法就是模板宣告中,以下兩種宣告沒有任何區別。template t class test template t class test typename的另乙個作用就是使用巢狀依賴型別 nested depended name include include using name...

條款49 了解new handle行為

多執行緒下的記憶體管理與單執行緒下是完全不同的,因為heap是乙個可以被全域性改動的資源,所以所有的執行緒都有可能去訪問這一資源,這回導致很多的race conditions。當operator new未取得想要的記憶體的時候,會呼叫乙個使用者指定的處理函式,new handler。這個函式可以使用...