2011-12-24 102 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