1. 程式人生 > >C++沉思錄__typename的用法

C++沉思錄__typename的用法

關於typename的用法,比較為大家所熟知的有一種:類模型引入的宣告

template<typename T>
class Atype
{

}

還有另外一種,就是一種很特別的情況。

當使用模板型別中定義的型別時,該怎麼辦呢?可以使用關鍵字typename。

/*
從定義中可以說明   typedef typename T::value_type value_type; 這句話強調
我們定義了一種型別的變數 這種變數型別依賴於模板引數型別 模板類中一定定義了這樣一種型別
*/
class AType {
public:
   typedef int value_type;
};
 
template<class T>
class TSample {
    typedef typename T::value_type value_type;
}

當使用TSample<AType>的時候,TSample的value_type就變成了AType::value_type。

當需要一個非例項化模板內部定義的型別時,就必須使用typename了。比如,定義一個模板類,這個類又使用了std::vector,

template<class T>
struct MyVector {
     std::vector<T> vec;
     typedef typename std::vector<T>::iterator;
};

為什麼這樣定義呢,C++預設就是將value_type解釋為一個變數的

。所以,為了和變數區分,必須使用typename告訴編譯器這是一個型別。