2012-01-30 69 views
1

可能重複:
Where and why do I have to put the 「template」 and 「typename」 keywords?C++的typedef簽名

我一直在尋找通過this boost::multi_array example,它有一個typedef如:

template <typename Array> 
... 
typedef typename Array::template subarray<2>::type::iterator iterator2; 

我明白什麼

typedef typename <type> <new_type>; 

簽名看起來像,但這有typedef typename之後的三件事情,我無法在網上找到將被稱爲或它做了什麼。有人可以分解typedef的作用,爲什麼它有三件事?我不認爲這是特定的刺激。

回答

2

template in Array::template與您已經瞭解的typename完全相同。它在typedef中的作用是告訴(承諾)編譯器subarray實際上是一個模板,因此<2>是有道理的。

這是完全一樣的typename關鍵字在typedef的作用,但隨着告訴編譯器的作用這是一個template,而不是一個類型。

1

這是老

typedef typename <type> <new_type>; 

你已經明白了。

typetypename Array::template subarray<2>::type::iterator

new_typeiterator2

1

當你寫一個模板函數/類,編譯器有時需要一些幫助。在此示例中,Array::template是模板類型內部的一種類型,這使得它需要typename

沒有這方面的需求,這類型定義也只是:

typedef Array::template subarray<2>::type::iterator iterator2; 

但是,這會(通常生成)編譯器錯誤。要解決此錯誤,只需插入typename關鍵字。

typedef typename Array::template subarray<2>::type::iterator iterator2; 
0

typename在這種情況下,一個幫手,讓編譯器知道這是一個類型。在編譯器在依賴類型和限定類型之間進行選擇時,該關鍵字在模板中使用。