鑑於這種代碼幫助在代碼模板
template <typename T>
typename T::ElementT at (T const &a , T const &b)
{
return a[i] ;
}
什麼
typename T::ElementT
和
a[i]
是什麼意思?
鑑於這種代碼幫助在代碼模板
template <typename T>
typename T::ElementT at (T const &a , T const &b)
{
return a[i] ;
}
什麼
typename T::ElementT
和
a[i]
是什麼意思?
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;
//...
};
現在,如果T
是sample
,那麼你可以寫T::ElementT
以及a[i]
這是型T
的。在這種情況下,當T
是樣本時,我假設指數i
的類型是int
。
我想在那個代碼中T總是一個有operator []重載的類並且有一個子類defenition ElementT任何其他沒有這兩個品質的類都會在編譯時產生錯誤。
typename T::ElementT
這exhaustingly由約翰在this entry到C++ FAQ說明。
a[i]
這種操作通常被稱爲 「訂閱」 並且訪問的第i個元素中a
。爲此,a
必須是數組或重載訂閱運算符的某個類(如std::vector
或std::map
)。但是,正如Nawaz在他的評論中指出的那樣,由於a
的類型爲T
,並且由於T
預計有嵌套類型ElementAt
,在這種情況下a
不能是數組。
請問你從哪裏得到這段代碼?這似乎很無用?並且它是否有這些錯誤(我認爲它應該是'const typename T :: ElementT',以及'b'和'i'是什麼?)還是你把它們放進去? – sbi 2011-04-02 07:18:58