2011-12-24 63 views
1

是什麼,他們似乎都工作相同,編譯奇怪的模板語法構造

template <class T> 
class why 
{ 
public: 
    why() 
    {} 
}; 

template <class T> 
class why 
{ 
public: 
    why<T>() 
    {} 
}; 

之間的差異。

編輯

而且,如果他們是真正的一樣,這是爲什麼功能即使在C++語言?

+2

它們是一樣的。 'why'是一個代名詞'爲什麼' – 2011-12-24 04:32:46

+0

嘛塞康一個是......你知道的,怪異的,你說。我也想知道它。那麼爲什麼在那裏?如果它是同義詞,有什麼意義? – 2011-12-24 04:33:01

回答

3

他們是等價的。在前者,why注入是已定義是相同why<T>名(其中T是實際的模板參數)。這存在爲便於打字。


請注意,此注入是在類的範圍內,而不是在它的外面。很明顯,但鑑於:

template <typename T> 
struct foo 
{ 
    foo x(foo f); 
}; 

一個常見的錯誤可能是嘗試定義x這樣的:

template <typename T> 
foo foo<T>::x(foo f) { return f; } 

但需要模板參數,這將在返回類型是一個錯誤,因爲foo。在參數列表中的foo是好的,但是,因爲foo<T>::後,我們在類的範圍,foo被定義爲foo<T>。所以正確的方法是這樣的:

template <typename T> 
foo<T> foo<T>::x(foo f) { return f; } 

template <typename T> 
foo<T> foo<T>::x(foo<T> f) { return f; } // equivalent 
+0

「'foo ::(foo f);'」有東西丟失...... – curiousguy 2011-12-24 05:18:20

+0

@curiousguy:哎呀。 :) – GManNickG 2011-12-24 05:44:09