從Scott Meyers的書中,依賴於模板參數的模板中的名稱被稱爲相關名稱。 (當嵌套在一個類中的從屬名稱,我把它叫做一個嵌套從屬名稱)2個與模板相關的typename種類的區別
因此,它需要依賴名稱前使用「類型名」關鍵詞,對不對?
template<typename C>
void print2nd(const C& container) {
typename C::const_iterator iter(container.begin());
...
}
但是,爲什麼在這段代碼,從約祖蒂斯書,標準::向量是另一個模板的實例採取這顯然是依賴於T,他們不使用「類型名」在這裏:
template <typename T>
class Stack {
(?typename?) std::vector<T> elems;
...
};
這一切看起來令人困惑,尤其是與邁耶斯的另一個例子:
template<typename IterT>
void workWithIterator(IterT iter) {
typename std::iterator_traits<IterT>::value_type temp(*iter);
... }
他們看起來都和我一樣。你如何區分?
,我掙扎着爬區別:)所以,當編譯器看到「C ::常量性」的任何具體類型實例/ C的替代之前的未知的,什麼是「常量性」是吧?但「std :: vector」還取決於確切的具體T,還是其不?僅僅因爲它是實例嗎? –
barney
從邁爾斯又如是指類似的東西到矢量但用 「類型名稱」 關鍵字仍然: 模板<類型名稱IterT> 空隙workWithIterator(IterT ITER){ 類型名稱的std :: iterator_traits :: VALUE_TYPE溫度(* ITER); ...} 爲什麼在這裏?是什麼iterator_traits 與向量區別? –
barney
@barney當編譯器看到'some_name :: some_other_name'它不希望看到一個類型時'some_name'是一個模板類型。所以你使用'typename'來告訴它是一個名字,而不是像它假設的那樣是一個非名字。 – NathanOliver