2011-04-02 101 views
1

鑑於這種代碼幫助在代碼模板

template <typename T> 
typename T::ElementT at (T const &a , T const &b) 
{ 
     return a[i] ; 
} 

什麼

typename T::ElementT 

a[i] 

是什麼意思?

+0

請問你從哪裏得到這段代碼?這似乎很無用?並且它是否有這些錯誤(我認爲它應該是'const typename T :: ElementT',以及'b'和'i'是什麼?)還是你把它們放進去? – sbi 2011-04-02 07:18:58

回答

3
typename T::ElementT 

由於T:ElementT是一個從屬名稱,這就是爲什麼你之前看到的關鍵字typename。它告訴編譯器ElementT是測試的類型,不是

而且a[i],看起來T是定義爲operator[]的類,當您編寫a[i]時正在調用它。例如,T可能是sample爲(部分)定義如下:

class sample 
{ 
public: 
     typedef int ElementT; //nested type! 

     //... 

     ElementT operator[](int i) 
     { 
      return m_data[i]; 
     } 

     ElementT *m_data; 
     //... 
}; 

現在,如果Tsample,那麼你可以寫T::ElementT以及a[i]這是T的。在這種情況下,當T是樣本時,我假設指數i類型int

0

我想在那個代碼中T總是一個有operator []重載的類並且有一個子類defenition ElementT任何其他沒有這兩個品質的類都會在編譯時產生錯誤。

0
typename T::ElementT 

這exhaustingly由約翰在this entry到C++ FAQ說明。

a[i] 

這種操作通常被稱爲 「訂閱」 並且訪問的第i個元素中a。爲此,a必須是數組或重載訂閱運算符的某個類(如std::vectorstd::map)。但是,正如Nawaz在他的評論中指出的那樣,由於a的類型爲T,並且由於T預計有嵌套類型ElementAt,在這種情況下a不能是數組。

+0

在這種情況下,'a'不能是數組,因爲'a'的類型是'T',它具有嵌套類型! – Nawaz 2011-04-02 07:19:19

+1

@Nawaz:確實。我想我今天一大早覺得不好。 – sbi 2011-04-02 07:20:44