typename在很多種情況下與class是完全相同的,例如下面的使用:
1 templame2......
3 template
4 ......
條款42:了解typename的雙重含義
1 template2void print2nd(const
c containter)
310 }
上面這個式子是無法通過編譯的:這裡的const_iterator實際上是個巢狀從屬名稱,編譯器實際上並不知道這是個型別名稱的。所以除非我們主動的告訴編譯器這是個型別名,否則其就會報錯:
1 typename c::const_iterator iter(container.begin());
那麼也就是說:任何時候想要在template中指涉乙個巢狀從屬型別名稱的話,那麼就需要在起前面放上typename關鍵字。當然他typename僅僅可以用在這個方面,其他的非巢狀從屬型別名稱上用typename實際上是不允許的:
1 template2void f(const c & container, //
注意,這裡的c前面即不允許加上typename
3 typename c::iterator iter);
還有兩種其他的不允許使用typename的特殊情況是:typename不可以出現在base class list內的巢狀從屬型別名稱之前,也不能在成員初始化列表中修飾base class
stl中經常也會用到了typename:
1 template2void
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。這個函式可以使用...